以下是 对象从新生代到老年代再到回收的全过程图解及详细说明:
一、JVM 内存结构图解
+-------------------+
| JVM 堆 |
| +---------------+ |
| | 老年代 | <--- 长期存活对象、大对象
| | (Old Gen) | |
| +---------------+ |
| | 新生代 | |
| | +-----------+ | |
| | | Eden | | <--- 新对象首先分配在此
| | +-----------+ | |
| | | Survivor | | |
| | | (From/To) | | <--- 存活对象复制到此(Minor GC 后交换角色)
| | +-----------+ | |
| +---------------+ |
+-------------------+
| 方法区 (Metaspace) | <--- 类元信息、常量池
+-------------------+
| 虚拟机栈 | <--- 线程栈帧(局部变量、方法调用)
| 本地方法栈 |
| 程序计数器 |
+-------------------+
二、对象生命周期流程图
[对象创建] → [Eden 区分配]
↓
(Eden 满)
↓
触发 Minor GC → [存活对象复制到 Survivor (From)]
↓
(每次 Minor GC 年龄+1)
↓
年龄达到阈值(默认15) → [晋升到老年代]
↓
(老年代空间不足或元空间溢出)
↓
触发 Full GC → [标记-清除-整理] → [回收不可达对象]
三、关键过程图解说明
1. 对象分配与 Minor GC
Eden 区分配:
+---------------------+
| Eden | ← 新对象分配
| [Obj1][Obj2][Obj3] |
+---------------------+
Survivor (From):
+---------------------+
| | ← 初始为空
+---------------------+
Survivor (To):
+---------------------+
| |
+---------------------+
触发 Minor GC 后:
+---------------------+
| Eden (Cleared) | ← 死亡对象被回收
+---------------------+
Survivor (From):
+---------------------+
| [存活对象] | ← 存活对象复制到 From,年龄+1
+---------------------+
Survivor (To):
+---------------------+
| | ← 备用
+---------------------+
2. 对象晋升老年代
Survivor 区年龄累计:
+---------------------+
| Survivor (From) |
| [Age=14][Age=15] | ← Age=15 的对象晋升到老年代
+---------------------+
晋升后老年代状态:
+---------------------+
| 老年代 |
| [晋升对象][长期对象] |
+---------------------+
3. Full GC 回收老年代
Full GC 前老年代:
+---------------------+
| [存活对象][垃圾对象] |
+---------------------+
标记-清除-整理后:
+---------------------+
| [存活对象] | ← 垃圾对象被回收,内存连续化
+---------------------+
四、调优关键参数与影响
1. 新生代与老年代比例:
- `-XX:NewRatio=2` → 老年代:新生代 = 2:1
- 增大新生代可减少过早晋升(如 `-XX:NewRatio=1`)
2. Survivor 区比例:
- `-XX:SurvivorRatio=8` → Eden:Survivor = 8:1:1
- 增大 Survivor 可减少直接晋升(如 `-XX:SurvivorRatio=6`)
3. 年龄阈值:
- `-XX:MaxTenuringThreshold=15` → 最大晋升年龄
- 降低阈值可能增加晋升速度(需结合监控调整)
4. 大对象阈值:
- `-XX:PretenureSizeThreshold=4m` → >4MB 直接进老年代
五、实际案例图解
案例:频繁 Full GC 优化
优化前:
[Eden 区过小] → 对象快速填满 → 频繁 Minor GC → 过早晋升 → 老年代堆积 → Full GC
优化后:
增大新生代(NewRatio=1) → 延长对象在 Survivor 的停留 → 减少晋升 → Full GC 频率降低
通过图解和参数调优,可直观理解对象生命周期及回收机制。实际应用中需结合工具(如 VisualVM、GCEasy)分析日志,定向优化内存分配策略。