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)来存放方法区。