【发布时间】:2014-08-26 13:42:10
【问题描述】:
当我对以下短语产生疑问时,我正在阅读文档:
由于收集器补充了 Python 中已经使用的引用计数,如果您确定您的程序不会创建引用循环,则可以禁用收集器。
这是什么意思?如果我禁用垃圾收集器 (gc.disable()) 并执行以下操作:
a = 'hi'
a = 'hello'
'hi' 会留在内存中吗?我需要自己释放内存吗?
我从那句话中了解到,gc 是一个额外的工具,专门用于捕获引用周期,如果禁用它,内存仍会使用对象的引用计数器自动清理,但不会管理引用周期.对吗?
【问题讨论】:
-
在您的示例中
'hi'确实会保留在内存中,但尝试释放它是错误的。作为字符串文字,它将被实习并存储为常量(在代码对象中)。但这可能不是你的问题。我建议你选择一个更无辜的例子(可能涉及列表)来转移人们对该问题的注意力。 -
因此,如果
a被引用到更复杂的东西,而不是简单的字符串字面量,那么那个“东西”会保留在内存中吗?我不能做点什么来释放内存空间吗? -
不,恰恰相反。字符串文字将保留在内存中与启用循环 GC 或数据的复杂性无关,字符串对象只是保持可访问性,因此甚至不会被循环 GC 收集。这只是因为您使用了字符串文字作为示例。其他数据不会从其他地方静默引用,并且变得无法访问并在
a = [1]; a = something else等示例中被释放。