426 字
2 分钟
JVM 运行时数据区:堆、方法区、虚拟机栈、本地方法栈与程序计数器

JVM 运行时数据区分成五块:堆、方法区、虚拟机栈、本地方法栈、程序计数器。其中堆和方法区是所有线程共享的,另外三个是每个线程私有的。

各区域职责#

  1. 堆在 JVM 规范中用于存放对象和数组,是 GC 的主要管理区域。分代收集器会在这里组织新生代和老年代;JIT 优化可能消除部分实际分配,不能把每个 new 都理解为必然创建一个独立堆对象。
  2. 方法区是规范层面的逻辑区域,保存类结构、运行时常量池等类型相关信息。HotSpot JDK 8 起主要用本地内存中的元空间保存类元数据。静态字段值随对应 Class 对象关联存放在堆中,字符串常量池也在堆中,JIT 编译代码则使用独立代码缓存,不能都说成存放在元空间。元空间仍可能因配置或系统资源不足而 OOM。
  3. 虚拟机栈是线程私有的,每调用一个方法就压一个栈帧进去,方法执行完就弹出来。栈帧里装着局部变量表、操作数栈、动态链接、方法返回地址这些东西。
  4. 本地方法栈跟虚拟机栈差不多,区别是它服务的是 native 方法,也就是用 C/C++ 写的那些 JNI 代码。
  5. 程序计数器记录当前线程的执行位置,执行 native 方法时其值未定义。JVM 规范没有为这个区域规定 OutOfMemoryError 情况,不应把结论归因于某个固定的实际字节数。

JVM 运行时数据区

JVM 运行时数据区:堆、方法区、虚拟机栈、本地方法栈与程序计数器
https://blog.xqcherry.top/posts/interview/jvm/jvm-memory-regions/
作者
xqcherry
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0