【JVM调优实战】06-堆的分代模型

堆的分代模型:新生代与老年代的职责划分

本文是《JVM调优实战》专栏第 6 讲。

你可能听过这样的经验:"Minor GC 很快,Full GC 要尽量避开。"但为什么 Minor GC 快?什么样的对象会进老年代?为什么 Survivor 区要有两个?空间分配担保又是什么意思?

这些问题的答案都藏在堆的分代模型里。分代是现代垃圾收集器最核心的设计思想之一,理解它,才能真正看懂 GC 日志、做好容量规划。本章我们就把堆的分代结构彻底拆开。

为什么分代:弱分代假说

分代收集并非 JVM 的发明,而源于一个经验性的统计规律,学术界称为弱分代假说(Weak Generational Hypothesis),包含两条:

  1. 绝大多数对象都是朝生夕灭的:存活时间极短,用完即弃。
  2. 熬过越多次垃圾收集的对象,就越难以消亡:老对象倾向于继续存活。

这两条假说可以用一张"对象存活衰减曲线"直观表示——绝大多数对象在第一次 GC 时就被回收,少数存活下来的对象则会长期驻留。

存活对象数量 │ │■■■■ │■■■■■■ │■■■■■■■■ │ ■■■ │ ■■■■ │ ■■■■■■■■■■■■■ ← 长期存活 └─────────────────────────────────