主题切换
分代收集算法
一、堆内存分代划分
Java8堆内存整体划分为新生代Young、老年代Old,内存占比 1:2。
- 新生代(占堆1/3) 内部分为三块:Eden、From Survivor、To Survivor,默认比例 8:1:1。
- Eden:所有新创建对象优先分配在此;
- From、To:两块对等幸存区,交替充当复制目标。
- 老年代(占堆2/3) 存放长期存活、经过多次GC晋升上来的对象,采用标记整理算法回收。
二、新生代回收完整工作流程(复制算法)
- 所有新建对象分配至Eden区;
- Eden空间不足触发MinorGC,标记Eden+From区全部存活对象;
- 将存活对象复制到空白To区,清空Eden与From;
- 交换From、To角色,下一次GC时To变为From,原From清空充当新To;
- 重复多次MinorGC后,对象存活次数达到阈值(默认15次),晋升到老年代;
- 特殊提前晋升场景:幸存区空间放不下存活对象、超大对象直接分配到老年代。
三、三种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晋升老年代。
- MinorGC:仅回收新生代,STW短;
- MixedGC:G1专属,回收新生代+部分老年代;
- FullGC:全堆回收,STW时间很长,线上需要规避。 GC执行时都会触发STW,暂停所有业务线程。