- 堆
- Java虚拟机栈
- 本地方法栈
- 方法区
- 程序计数器
- 运行时常量池
线程私有(每个线程独有一份,生命周期与线程相同)
程序计数器
作用 :记录当前线程正在执行的字节码指令地址(行号),PC寄存器记录当前执行到第几条字节码指令 。
为每个线程维护一个独立的程序计数器,用于指示下一条将要被执行的字节码指令的位置。
java虚拟机栈
作用 :描述Java方法执行的内存模型 。每个方法被调用时都会创建一个栈帧。
- 局部变量表:存储方法参数和方法内的局部变量(基本类型 + 对象引用)。
- 操作数栈:用于存放计算过程中的中间结果(类似CPU的寄存器)。
- 动态链接:指向运行时常量池中该方法的符号引用,用于转换为直接引用。
- 方法出口(返回地址):方法执行完后返回调用处的地址。
本地方法栈
与Java虚拟机栈类似,但为 native****修饰的方法(C/C++实现)服务
线程共享(所有线程共用,需考虑并发安全问题)
堆
作用 :存储所有对象实例和数组 。这是JVM管理内存中**最大的一块,**Java堆还用于垃圾回收,虚拟机发现没有被引用的对象时,就会对堆中对象进行垃圾回收,以释放内存空间。
方法区(类模板)
JDK 8及以后改名为 "元空间(Metaspace)", 并将物理内存从JVM堆移到了本地内存
作用: 存储已被JVM加载的类信息 、静态变量 、即时编译器(JIT)编译后的代码缓存 等,编译后的代码等数据的内存区域(告诉 JVM 这个类有哪些字段、方法、继承关系、异常处理, 相当于操作手册)
运行时常量池是方法区的一部分
用于存储编译阶段生成的信息,主要有字面量和符号引用常量两类。其中符号引用常量包括了类的全限定名称、字段的名称和描述符、方法的名称和描述符。
main() 方法执行时:
1. 栈帧入栈(Java虚拟机栈) → 存放局部变量引用
2. new Object() → 在堆内存中分配对象实例
3. 对象类型信息 → 存储到方法区(元空间)
4. PC寄存器记录当前执行到第几条字节码指令
字符串常量池:相同的字符串只存一份,所有引用都指向同一份数据。 JDK 7 之后移到了堆里