【JVM】2、对象从新生代到老年代再到回收

58 阅读2分钟

以下是 对象从新生代到老年代再到回收的全过程图解及详细说明


一、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 频率降低

通过图解和参数调优,可直观理解对象生命周期及回收机制。实际应用中需结合工具(如 VisualVMGCEasy)分析日志,定向优化内存分配策略。