JVM的运行时内存区域

  • 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 之后移到了堆里