- PC计数器:较小的一块内存空间。在JVM的概念模型里,字节码解释器主要通过改变其 值来确定执行下一条字节码指令。分支、跳转、异常处理、线程恢复功能都依赖PC计数器完成。该区域是JVM规范中唯一一个没有规定任何OutOfMemoryError的区域
- 虚拟机栈:线程私有,生命周期与线程相同。每个方法被创建时都会创建一个帧栈,帧栈包括了局部变量表、操作栈、动态链接、出口等信息。每一个方法的调用到结束都伴随着帧栈在虚拟机栈的入栈出栈。局部变量表存放了编译期的8种基本类型,以及returnAddress,reference引用类型;reference类型并不一定是对象本身,有可能指向代表对象的的句柄引用,也可能是对象起始地址的指针。局部变量表所需的内存空间在编译期完成分配,方法调用时在帧栈中分配多大局部变量表已完全确定,方法运行期间不会改变。
- 堆:JVM管理的最大一块空间,随着JVM的启动创建。JVM规范中所有的对象实例和数组都在堆中分配内存。堆还可以划分:年轻代[eden,fromSurvior, toSurvior] ,老年代
- 方法区:存储被JVM加载的类信息,常量,静态变量等数据。此区域很少GC,主要回收常量与对类型的卸载。
- 运行时常量池:方法区的一部分,类加载后存放class文件的常量池,存放在编译期生成的各种字面量和符号引用。也会把翻译的直接引用存放在运行时常量池。JVM规定常量并不一定只在编译期产生,运行期间可能将新的常量加到该池中(String 的 intern方法())