目录

JVM-RuntimeDataArea-成分

JVM RuntimeDataArea 成分

根据 JVM 规范, 运行时数据区(Runtime Data Area) 是 JVM 内存管理的核心模块,分为以下 5 个主要部分(按线程共享性分类):


一、线程私有区域

1. 程序计数器(Program Counter Register)—- PC
  • 作用
    • 记录当前线程执行字节码指令的地址(行号指示器)。
    • 执行 Native 方法时,计数器值为 Undefined
  • 特性
    • 唯一不会发生 OutOfMemoryError 的区域。
2. Java 虚拟机栈(Java Virtual Machine Stack)
  • 作用
    • 存储方法调用的栈帧(Frame),每个栈帧包含:
      • 局部变量表 (基本类型、对象引用)。
      • 操作数栈 (计算过程的临时数据)。
      • 动态链接 (指向方法区常量池的符号引用)。
      • 方法返回地址
    • 方法调用对应栈帧的入栈和出栈。
  • 异常
    • StackOverflowError :栈深度超过限制(如无限递归)。
    • OutOfMemoryError :栈扩展失败(如线程过多)。
3. 本地方法栈(Native Method Stack)
  • 作用
    • 为 Native 方法(如 C/C++ 实现的方法)提供服务。
  • 特性
    • HotSpot JVM 将虚拟机栈与本地方法栈合并。
  • 异常 :与虚拟机栈相同。

二、线程共享区域

4. Java 堆(Java Heap)
  • 作用
    • 存放对象实例和数组(所有对象分配内存的主区域)。
    • GC 的主要管理区域(分代回收机制)。
  • 结构
    • 新生代 (Eden、Survivor 区)。
    • 老年代
  • 异常OutOfMemoryError (堆内存不足)。
5. 方法区(Method Area)
  • 作用
    • 存储类元数据(类名、字段、方法、接口等)。
    • 运行时常量池(字面量、符号引用)。
    • JIT 编译后的代码缓存。
  • 实现演变
    • JDK 7 及之前:永久代(PermGen)。
    • JDK 8 及之后:元空间(Metaspace,使用本地内存)。
  • 异常OutOfMemoryError (类元数据过多)。

三、补充:直接内存(Direct Memory)

  • 特性
    • 非 JVM 运行时数据区,但通过 NIO 的 DirectByteBuffer 分配。
    • 避免 Java 堆与 Native 堆间的数据复制,提升 I/O 性能。
  • 异常OutOfMemoryError (本地内存不足)。

总结:内存区域对比

区域线程共享性存储内容异常类型
程序计数器私有指令地址
虚拟机栈私有方法栈帧Stack/OutOfMemoryError
本地方法栈私有Native 方法栈帧Stack/OutOfMemoryError
共享对象实例OutOfMemoryError
方法区共享类元数据、常量池OutOfMemoryError
直接内存(补充)共享NIO 缓冲区OutOfMemoryError

提示 :各区域的内存分配参数可通过 JVM 选项调整(如 -Xmx 设置堆最大值, -XX:MaxMetaspaceSize 限制元空间)