Java基础(3)——JVM内存模型

Java for android 基础知识。

JVM的内存结构分为:

方法区(method)

栈内存(stack)

堆内存(heap)

本地方法栈(java中jni的调用)

1.堆内存:

所以通过new创建的对象的内存都在堆中分配。

操作系统有一个记录空闲内存地址的链表,当系统收到程序申请时,会便利该链表,寻求第一个空间大于所申请空间的堆结点,然后将该结点从空闲中删除,并将该结点分配给程序。

获得空间比较大,也比较灵活。

2.栈内存:

在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话意思是栈顶的地址和栈最大容量都是预先规定好的,在win下,栈的大小是固定的(编译时就确定的一个常数),如果申请空间超过栈的剩余空间就会overflow。

由系统自动分配,获得空间较小,速度较快,但程序员无法控制。

***堆与栈的补充说明***

基础数据类型直接分配在栈空间,方法的形式参数,直接直接在栈空间分配,当方法调用完成后从栈空间回收。

引用数据类型,需要new来创建,即在栈空间分配一个地址空间,又在堆空间对象的类变量。

方法的引用参数,在栈空间分配一个地址空间,并指向堆空间对象区,当方法调用完成后从栈空间回收。

局部变量new出来时,在栈和堆分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间等待GC垃圾回收。

字符串常量,static在DATA区域分配,this在堆分配,数组在栈空间分配数组名称,又在堆空间分配实际大小。

3.本地方法栈

用于支持native方法(NDK)执行,储存了每个native方法的调用状态。对于本地方法接口,实现JVM并不要求一定要它支持,甚至可以完全没有。Java本地接口(JNI)是出于可移植性考虑。

4.方法区

保存了方法代码(编译后的java代码)和符号表。存放了加载的类信息、静态变量、final类型常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区。

你可能感兴趣的:(Java基础(3)——JVM内存模型)