Python 中的 GC(垃圾回收)

# 引用计数(reference counting)

CPython 中默认使用的垃圾回收算法是 Reference Counting。也就是对每个元素标记有多少个其他元素引用了它,当引用数降到零的时候就删除。

1. 当对象增加一个引用,比如赋值给变量,属性或者传入一个方法,引用计数执行加1运算。
2. 当对象减少一个引用,比如变量离开作用域,属性被赋值为另一个对象引用,属性所在的对象被回收或者之前传入参数的方法返回,引用计数执行减1操作。
3. 当引用计数变为0,代表该对象不被引用,可以标记成垃圾进行回收。

为了解决循环引用的问题,CPython 使用了 Cyclic GC,遍历所有的环,并且把每一个元素的引用减一,来检测每一个引用环是不是循环应用。

![](https://ws2.sinaimg.cn/large/006tKfTcly1ftg5mu2087j30we0i6gv5.jpg)

# 标记删除(Mark and Sweep)

1. 从某一个已知的还活着的对象开始,便利对象,如果经过了某个对象就认为是活着的
2. 如果没有被标记的就删除

避免了循环引用的问题

![](https://ws1.sinaimg.cn/large/006tKfTcly1ftf9x2kejlj30wo0ic11s.jpg)

实际的处理过程

![](https://ws4.sinaimg.cn/large/006tKfTcly1ftfa55k2e7j30wi0ick3k.jpg)

![](https://ws3.sinaimg.cn/large/006tKfTcly1ftfa6amfmmj30wc0iedr8.jpg)

Pluggable
Generational
Incremental

参考资料:

1. https://www.youtube.com/watch?v=iHVs_HkjdmI
2. https://droidyue.com/blog/2015/06/05/how-garbage-collector-handles-circular-references/
3. https://www.cnblogs.com/Xjng/p/5128269.html
4. https://foofish.net/python-gc.html

About 逸飞

后端工程师

发表评论

电子邮件地址不会被公开。 必填项已用*标注