每创建一个 GC Obejct,就检查 Gen0 对象数量是否超过 700.
继续创建对象,当然也会检查 Gen0 对象数量,未超标就继续。
为了触发 GC,还需分配 689 Objects,共 701 个 0 代对象。
满足 GC 条件,Gen0 Objects 超过 700,从最老的 Gen2 开始检查 Objects 数量是否超标
Gen2 未超过阈值,继续检查年轻一代。
直到 Gen0 超标了。
那么就在 Gen0 开始 GC。
先标记 “循环引用” 的对象,即垃圾。
再将这些对象分开在两个链表,垃圾在 unreachable 链表。
Gen0 生存下来的对象会被升到 Gen1.
Gen0 的垃圾中,实现了 finallizer 的对象也不处理,提升到 Gen1.
释放那些 unreachable 对象,一次 GC 结束。
运行一段时间后,Gen0 可能再次满足开始 GC 的条件。当 1 代对象数量超出阈值,0 代对象会合并到 1 代链表后处理。
同样的,1 代对象链表也会被拆分为 2 部分,unreachable 链表中的对象会在稍后释放,其他对象则继续升到更老一代。
最终 unreachable 对象被释放,又完成一次 GC。
回到 步骤 5 继续执行,这既是 GC 的大概流程。