JVM内存结构科普:一计两栈一堆一区,详解五大核心区域

文章导读
JVM内存结构主要分为五大核心区域:方法区(一计)、虚拟机栈、本地方法栈(两栈)、堆(一堆)、程序计数器(一区)。方法区存储类信息、常量、静态变量等;虚拟机栈用于存储局部变量表、操作数栈等;本地方法栈支持native方法执行;堆是对象和数组的主要存储区;程序计数器记录当前线程执行的字节码指令地址。
📋 目录
  1. A 程序计数器(PC Register)
  2. B Java虚拟机栈(Java Virtual Machine Stack)
  3. C 本地方法栈(Native Method Stack)
  4. D 堆(Heap)
  5. E 方法区(Method Area)
A A

JVM内存结构主要分为五大核心区域:方法区(一计)、虚拟机栈、本地方法栈(两栈)、堆(一堆)、程序计数器(一区)。方法区存储类信息、常量、静态变量等;虚拟机栈用于存储局部变量表、操作数栈等;本地方法栈支持native方法执行;堆是对象和数组的主要存储区;程序计数器记录当前线程执行的字节码指令地址。

程序计数器(PC Register)

程序计数器是每个线程私有的内存区域,用于记录当前线程执行的字节码指令地址。如果线程执行的是Java方法,则记录下一条指令地址;如果是Native方法,则为空。唯一一个不会发生OutOfMemoryError的区域。

Java虚拟机栈(Java Virtual Machine Stack)

Java虚拟机栈也是线程私有的,其生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型,每个方法执行都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。StackOverflowError表示栈深度超过虚拟机允许的最大深度。

本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈类似,也是线程私有的,主要服务于Native方法。一些虚拟机(如Sun HotSpot)将虚拟机栈和本地方法栈合并。

JVM内存结构科普:一计两栈一堆一区,详解五大核心区域

堆(Heap)

堆是JVM中最大的内存区域,也是共享的内存区域,用于存放对象实例,几乎所有对象实例都在此分配内存。堆被分为新生代和老年代,进一步细分为Eden、From Survivor、To Survivor等。OutOfMemoryError常见于堆空间不足。

方法区(Method Area)

方法区是各线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。HotSpot虚拟机将其实现为永久代(PermGen),JDK8后改为元空间(Metaspace)。

FAQ
Q: JVM内存结构中哪个区域是线程私有的?
A: 程序计数器、虚拟机栈和本地方法栈是线程私有的。
Q: 堆的作用是什么?
A: 堆主要用于存储对象实例和数组,是JVM中最大的内存区域。
Q: 方法区在JDK8中发生了什么变化?
A: 从永久代改为元空间,使用本地内存存储。
Q: 什么情况下会抛出StackOverflowError?
A: 当栈深度超过虚拟机允许的最大深度时,比如递归调用过深。