【问题标题】:Garbage collection in python and reference countingpython中的垃圾收集和引用计数
【发布时间】:2015-11-04 16:33:21
【问题描述】:

我正在尝试调试为什么我的一个对象没有被垃圾收集,并且我在尝试查看文档/以前的问题时遇到了几个问题:

1) 如果我的对象没有参与任何引用循环,我认为垃圾收集不涉及,并且 Python 在对象的引用计数降至 0 时简单地释放内存是对的吗?

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

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

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

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

【问题讨论】:

标签: python garbage-collection


【解决方案1】:

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}]

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

【讨论】:

  • 完美!我唯一不清楚的是 2 和 3。如果我的对象没有引用周期,如果引用计数为零,gc.collect 会释放内存吗?感谢您对 4 的澄清。现在我确实发现 b=a 增加了引用者的数量……但我得到了 10 个对象,然后是 11 个。所以当文档说当“引用计数”下降到 0 时释放内存时,获取引用计数的正确方法是什么?剩下的最后一个问题是,您是否保证一旦引用计数降至 0,就会释放没有引用循环的对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多