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),每个栈帧包含:
- 局部变量表 (基本类型、对象引用)。
- 操作数栈 (计算过程的临时数据)。
- 动态链接 (指向方法区常量池的符号引用)。
- 方法返回地址 。
- 方法调用对应栈帧的入栈和出栈。
- 存储方法调用的栈帧(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 性能。
- 非 JVM 运行时数据区,但通过 NIO 的
- 异常
:
OutOfMemoryError
(本地内存不足)。
总结:内存区域对比
区域 | 线程共享性 | 存储内容 | 异常类型 |
---|---|---|---|
程序计数器 | 私有 | 指令地址 | 无 |
虚拟机栈 | 私有 | 方法栈帧 | Stack/OutOfMemoryError |
本地方法栈 | 私有 | Native 方法栈帧 | Stack/OutOfMemoryError |
堆 | 共享 | 对象实例 | OutOfMemoryError |
方法区 | 共享 | 类元数据、常量池 | OutOfMemoryError |
直接内存(补充) | 共享 | NIO 缓冲区 | OutOfMemoryError |
提示
:各区域的内存分配参数可通过 JVM 选项调整(如
-Xmx
设置堆最大值,
-XX:MaxMetaspaceSize
限制元空间)