1. 分代 GC 把堆分为 Young/Old 代依据的是哪条弱分代假说?Minor GC 与 Full GC 的触发条件有何不同?
分代 GC 把堆分为 Young/Old 代依据的是哪条弱分代假说?Minor GC 与 Full GC 的触发条件有何不同?
- 弱分代假说:大多数对象存活时间很短
- 分代划分与新生代收集
- Minor GC 与 Full GC 触发条件
分代 GC 依据弱分代假说(weak generational hypothesis):绝大多数对象存活时间很短(很快变成垃圾),而少数对象存活时间较长。据此把堆分为新生代(Young)与老年代(Old),新生代对象快速分配、频繁回收,老年代对象存活久、回收少。Minor GC(新生代回收)在新生代空间(如 Eden/Survivor)被填满、无法分配新对象时触发,只回收新生代,速度快、停顿小,存活对象晋升到老年代。Full GC(整堆回收)在老年代也被填满、或 CMS 类并发回收失败、或需要整堆压缩/元空间不足时触发,回收整个堆,通常伴随较长的停顿。因此触发条件根本区别在于"新生代还是老年代内存不足"。
弱分代假说使得"只回收新生代"能以极低代价回收大部分垃圾,从而以 Minor GC 的频繁小停顿替代全局 Full GC;Full GC 因涉及老年代与元空间,代价高,故触发条件更严格。