JVM 内存模型
TIP
JVM(Java Virtual Machine)内存模型是理解 Java 内存管理和性能优化的基础。了解各个区域的作用对排查内存问题至关重要。
运行时数据区
JVM 内存结构
├── 线程私有
│ ├── 程序计数器
│ ├── 虚拟机栈
│ └── 本地方法栈
└── 线程共享
├── 堆(Heap)
└── 方法区(Method Area / MetaSpace)堆内存(Heap)
Java 堆是 GC 管理的主要区域:
java
// 堆参数设置
// -Xms512m 初始堆大小
// -Xmx2g 最大堆大小
// -Xmn256m 新生代大小
// 堆结构
// 新生代:Eden : S0 : S1 = 8 : 1 : 1
// 老年代:存放长期存活的对象虚拟机栈
每个方法调用会创建一个栈帧:
java
public int add(int a, int b) {
// 每个方法对应一个栈帧入栈
int result = a + b;
return result;
// 方法结束栈帧出栈
}每个栈帧包含:
- 局部变量表
- 操作数栈
- 动态链接
- 方法出口
方法区
JDK8 之后元空间(MetaSpace)取代了永久代(PermGen):
java
// 方法区存储
// - 类信息(Class)
// - 常量池
// - 静态变量
// - JIT 编译后的代码
// MetaSpace 参数
// -XX:MetaspaceSize=256m
// -XX:MaxMetaspaceSize=512mGC Roots 对象
可达性分析算法中作为根的对象:
- 虚拟机栈中引用的对象
- 方法区中静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中 JNI 引用的对象
TIP
了解 JVM 内存模型有助于定位内存泄漏(OOM)和优化 GC 性能。常见的内存问题包括堆溢出、栈溢出和元空间溢出。