1. JVM 内存结构概览
JVM内存分为栈内存、堆内存、方法去、程序计数器。
其中堆内存主要划分为两个区域:
- 新生代(Young Generation)
- 老年代(Old Generation / Tenured Generation)
2. 新生代(Young Generation)
组成部分:
- Eden 区:大多数对象在此创建。
- Survivor 区(S0 和 S1):用于存放从 Eden 中经过一次 Minor GC 后仍然存活的对象。
特点:
- 大多数对象生命周期短,因此会很快被回收。
- 发生垃圾回收频率高但速度快,称为 Minor GC 或 Young GC。
分配流程:
- 对象优先在
Eden分配; - 当
Eden满时触发 Minor GC; - 存活对象进入其中一个 Survivor 区(如 S0);
- 下次 GC 时,Eden 和 S0 中存活对象移至另一个 Survivor(如 S1),并交换角色;
- 若对象年龄达到阈值(默认 15),则晋升到老年代。
3. 老年代(Old Generation)
存放内容:
- 生命周期较长的对象;
- 从新生代多次 GC 后仍存活的对象;
- 大对象可能直接分配进老年代(可通过
-XX:PretenureSizeThreshold设置);
回收机制:
- 使用标记-清除或标记-整理算法;
- 触发 Full GC,耗时更长且影响性能。
触发条件:
- 老年代空间不足;
- 方法区(元空间)满;
- 显式调用 System.gc()(不一定执行);
4. 常见参数配置
| 参数 | 描述 |
|---|---|
-Xms / -Xmx |
初始堆大小 / 最大堆大小 |
-XX:NewRatio |
老年代与新生代比例,默认为 2(即老年代占 2/3) |
-XX:SurvivorRatio |
Eden 与一个 Survivor 的比例,默认为 8 |
-XX:MaxTenuringThreshold |
对象晋升到老年代的最大年龄 |
总结
JVM 内存模型根据对象生命周期的不同将堆内存划分为新生代和老年代,并采用不同的垃圾收集策略优化效率。了解这些有助于调优应用性能及排查 OOM 异常等问题。