09月17, 2020

34. 图解 GC

image.png

每创建一个 GC Obejct,就检查 Gen0 对象数量是否超过 700.

image.png

继续创建对象,当然也会检查 Gen0 对象数量,未超标就继续。

image.png

为了触发 GC,还需分配 689 Objects,共 701 个 0 代对象。

image.png

满足 GC 条件,Gen0 Objects 超过 700,从最老的 Gen2 开始检查 Objects 数量是否超标

image.png

Gen2 未超过阈值,继续检查年轻一代。

image.png

直到 Gen0 超标了。

image.png

那么就在 Gen0 开始 GC。

image.png

先标记 “循环引用” 的对象,即垃圾。

image.png

再将这些对象分开在两个链表,垃圾在 unreachable 链表。

image.png

Gen0 生存下来的对象会被升到 Gen1.

image.png

Gen0 的垃圾中,实现了 finallizer 的对象也不处理,提升到 Gen1.

image.png

释放那些 unreachable 对象,一次 GC 结束。

image.png

运行一段时间后,Gen0 可能再次满足开始 GC 的条件。当 1 代对象数量超出阈值,0 代对象会合并到 1 代链表后处理。

image.png

同样的,1 代对象链表也会被拆分为 2 部分,unreachable 链表中的对象会在稍后释放,其他对象则继续升到更老一代。

image.png

最终 unreachable 对象被释放,又完成一次 GC。

回到 步骤 5 继续执行,这既是 GC 的大概流程。

本文链接:http://www.thinkinpython.com/post/deep_python_vm_34.html

-- EOF --