主要分区
Java虚拟机将其管辖的内存大致分为以下三个逻辑部分:
1. 方法区
方法区是静态分配的,编译器将变量绑定在某个储存位置上,并且这些绑定不会在运行时改变常数池源代码中的命令常量。String常量和static变量保存在方法区。
2. Java栈
Java栈是一个逻辑概念,特点是后进先出。一个栈的空间可能是连续的,也可能是不连续的。最典型的Stack的应用是方法的调用。Java虚拟机每调用1次方法就创建一个方法帧。退出该方法则对应的方法针被弹出。栈中存储的数据也是运行时确定的。
3. Java堆
Java堆内存的分配意味着以随意的顺序在运行时进行存储空间分配和收回的内存管理模型。堆中存储的数据常常是大小、数量和生命期在编译期时无法确定的。Java对象的内存总是在heap中分配。
分配逻辑
Java数据分配:
- 基础数据类型直接在栈空间分配。
- 方法的形式参数直接在栈空间分配,当方法调用完成后从栈空间回收。
- 引用数据类型需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量。
- 方法的引用参数在栈空间分配一个地址空间,并指向堆空间的对象区。当方法调用完后,从栈空间回收。
- 局部变量new出来时,在栈空间和堆空间分配空间。当局部变量生命周期结束后,栈空间立即被回收,堆空间区域等待GC回收。
- 方法调用时传入的实际参数先在栈空间分配,在方法调用完成后,从栈空间释放。
- 字符串常量在DATA.区域分配,this在堆空间分配。
- 数组既在栈空间分配数组名称,又在堆空间分配数组实例的大小。
参考资料:谈谈JVM的内存结构和内存分配