python GC - 引用计数仅在 gc.collect() 时有效?

标签 python garbage-collection

我理解 Python GC 有两种工作方式:
1) 基本引用计数 - 当“name”设置为“Tom”时,“John”下方的引用计数为零

name = "John"
name = "Tom" (Reference count zero for "John")

2) 检测循环引用(隔离岛)。 “GC”在不确定的时间工作(或者如果您调用不推荐的 gc.collect())。

现在,我的问题是,对于 (1),当 name 设置为“Tom”时,不会在 name = “Tom” 时立即收集“John”,对吗? GC 只会将“John”标记为un-reachable 并因此准备好收集(这将在以后发生)。
我的理解正确吗?谢谢

引用:
https://rushter.com/blog/python-garbage-collector/ https://pythoninternal.wordpress.com/2014/08/04/the-garbage-collector/

最佳答案

关闭,但关键细节已关闭:当 CPython 中的引用计数降至 0 时,立即 收集当时未引用的对象。这与循环GC系统无关。实际上,您可以执行 gc.disable() 以完全禁用循环 GC 系统,引用计数将继续自行收集非循环垃圾。

您可以自己查看,例如,

import gc
gc.disable()
i = 1
while True:
    xs = [i]
    i += 1

它永远运行,但内存使用将保持稳定。这是因为单独的引用计数会为整数和每次迭代创建的列表回收内存。

关于python GC - 引用计数仅在 gc.collect() 时有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377863/

相关文章:

python - Django:如何将 STATIC_URL 设为空?

python - 如何以纯数据格式获取 Python Sphinx 文档?

java - 线程是否开始使用与其他对象相同的方式收集 'new Thread(r).start()' 垃圾?

内存不足错误后PHP自动添加错误

python - 如何打印 1-9999 之间的数字?

python - 使用 sql alchemy 查询有一种方法可以遍历表中的所有列

multithreading - 检测当前线程的堆栈范围

java - G1 GC 中的内存分配

python - 列表索引超出范围语法错误

java - 了解 Android GC 消息