python中的垃圾收集和引用计数

时间:2015-11-04 16:33:21

标签: python garbage-collection

我试图调试为什么我的一个对象没有被垃圾收集,我在尝试浏览文档/之前的问题时遇到了几个问题:

1)如果我的对象没有涉及任何引用周期,我是否正确,垃圾收集不涉及,并且当对象的引用计数降至0时,Python只是释放内存?

2)当这样一个简单对象的引用计数达到0时,是否立即释放内存,如果没有,是否有办法强制释放它?

3)Python是否使用sys.getrefcount(obj)来跟踪引用计数?

4)为什么下面的代码片段没有将引用者的数量从1增加到2(它两次都打印1次)?

import gc
a = []
print(len(gc.get_referrers(a))
b = a
print(len(gc.get_referrers(a))

1 个答案:

答案 0 :(得分:3)

1)是的,你是对的。如果您确定您的代码不包含参考周期,您甚至可以禁用GC:https://docs.python.org/2/library/gc.html

  

由于收集器补充了已经使用的引用计数   Python,如果你确定你的程序,你可以禁用收集器   不会创建参考周期。可以禁用自动收集   通过调用gc.disable()。

2)如果你想强制收集阶段,你可以简单地拨打collect

3)sys.getrefcount(obj)包含对函数参数的引用,不确定它是否回答了你的问题

4)get_referrers的返回不是一个简单的列表,它是一个带有包含对象引用的字典的列表。 尝试打印完整的回报,你会有类似的东西:

[{'a': [], 'b': [], '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'yourfile.py', '__package__': None, 'gc': <module 'gc' (built-in)>, 'x': {...}, '__name__': '__main__', '__doc__': None}]

您可以将对象的所有引用视为字典中的元素。