Skip to content

分代收集算法

一、堆内存分代划分

Java8堆内存整体划分为新生代Young、老年代Old,内存占比 1:2。

  1. 新生代(占堆1/3) 内部分为三块:Eden、From Survivor、To Survivor,默认比例 8:1:1。
    • Eden:所有新创建对象优先分配在此;
    • From、To:两块对等幸存区,交替充当复制目标。
  2. 老年代(占堆2/3) 存放长期存活、经过多次GC晋升上来的对象,采用标记整理算法回收。

二、新生代回收完整工作流程(复制算法)

  1. 所有新建对象分配至Eden区;
  2. Eden空间不足触发MinorGC,标记Eden+From区全部存活对象;
  3. 将存活对象复制到空白To区,清空Eden与From;
  4. 交换From、To角色,下一次GC时To变为From,原From清空充当新To;
  5. 重复多次MinorGC后,对象存活次数达到阈值(默认15次),晋升到老年代;
  6. 特殊提前晋升场景:幸存区空间放不下存活对象、超大对象直接分配到老年代。

三、三种GC类型区别

1. MinorGC(Young GC)

只回收新生代,STW停顿时间短,频率较高,使用复制算法。

2. MixedGC

G1收集器独有,同时回收全部新生代 + 部分老年代分区,停顿可控。

3. FullGC

完整回收新生代+老年代,STW停顿时间极长,线上业务需要尽量避免触发。

四、STW概念

STW全称Stop-The-World,执行GC时暂停全部用户业务线程,直到垃圾回收完成后恢复运行,所有GC都会产生STW,只是停顿时长差异巨大。

五、面试简答

问:什么是分代收集?MinorGC、MixedGC、FullGC有什么区别?

答:JVM根据对象存活周期将堆分为新生代、老年代,采用不同回收算法即分代收集。新生代分为Eden、From、To(8:1:1),新对象放Eden,GC后存活对象复制到幸存区,熬过15次MinorGC晋升老年代。

  1. MinorGC:仅回收新生代,STW短;
  2. MixedGC:G1专属,回收新生代+部分老年代;
  3. FullGC:全堆回收,STW时间很长,线上需要规避。 GC执行时都会触发STW,暂停所有业务线程。

Powered by VitePress 1.6.4 | 持续更新中