我了解Python GC的工作方式有两种:
1)基本引用计数-当“姓名”设置为“汤姆”时,“约翰”下方的引用计数为零
name = "John"
name = "Tom" (Reference count zero for "John")
2)检测循环引用(隔离岛)。 “ 在确定时间(或不建议您调用gc.collect()的时间)工作。
现在,我的问题是,对于(1),当名称设置为“ Tom”时,名称=“ Tom”对不立即立即收集? GC只会将“ John”标记为无法到达,从而可以进行收集(稍后会发生这种情况)。
我的理解正确吗?谢谢
参考:
https://rushter.com/blog/python-garbage-collector/
https://pythoninternal.wordpress.com/2014/08/04/the-garbage-collector/
答案 0 :(得分:3)
关闭,但是关键细节不可用:当CPython中引用计数降至0时,立即收集当时未引用的对象。这与循环GC系统无关。实际上,您可以执行import gc
gc.disable()
i = 1
while True:
xs = [i]
i += 1
来完全禁用循环GC系统,并且引用计数将继续自行收集非循环垃圾。
例如,您可以自己查看
{{1}}
这将永远运行,但是内存使用将保持稳定。那是因为单独进行引用计数会回收整数和每次迭代创建的列表的内存。