Skip to content

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=512m

GC Roots 对象

可达性分析算法中作为根的对象:

  • 虚拟机栈中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI 引用的对象

TIP

了解 JVM 内存模型有助于定位内存泄漏(OOM)和优化 GC 性能。常见的内存问题包括堆溢出、栈溢出和元空间溢出。