4

gc.get_referrers(obj) 是否可以为对象返回一个空列表,但仍然可以通过弱引用访问该对象?

如果是这样,我将如何开始尝试确定该对象未被垃圾收集的原因?

编辑:我不确定在这种情况下代码示例将如何帮助 - 显然某处有很强的参考,但如果我能找到它,我会被诅咒的。我的印象是对对象的所有强引用都将由 get_referrers() 标识。

编辑:已解决。我发现该变量具有强引用 - 它在游戏事件循环中,但不是类变量,因此 get_referrers 没有选择它。

4

5 回答 5

1

是:http ://docs.python.org/library/weakref.html

弱引用不会使对象保持活动状态。

get_referrers() 函数只会定位那些支持垃圾回收的容器;不会找到确实引用其他对象但不支持垃圾回收的扩展类型。

是什么让您认为该对象没有被收集?另外,您是否尝试过 gc.collect()?

于 2009-07-14T20:32:51.293 回答
1

也可能是引用被有缺陷的 C 扩展泄露,恕我直言,您不会看到引用者,但引用计数仍然没有下降到 0。您可能需要检查sys.getrefcount.

于 2009-07-14T21:37:41.443 回答
1

我很高兴您发现了与最初问题无关的问题。尽管如此,我对后代的答案有不同的看法,以防其他人有问题。

对象没有引用者但不被垃圾收集是合法的。

来自 Python 2.7 手册:“实现可以推迟垃圾收集或完全忽略它——只要没有收集仍然可访问的对象,垃圾收集的实现方式就是实现质量的问题。”

NO-OP 垃圾收集器是合法的。

关于分代和引用计数垃圾收集器的讨论是指特定的 CPython 实现(如问题中标记的那样)

于 2010-11-04T03:26:36.830 回答
0

正如Christopher 所说,弱引用不计入对象引用计数,因此无法阻止 Python 删除对象。

但是,Python 的垃圾收集器不会删除循环引用中__del__定义了方法的对象。
您可以使用gc.garbage检查(并修复)这种情况。

于 2009-07-14T20:38:33.637 回答
0

如果您确实对该对象有强引用,请使用 gc.get_referrers(obj) 来查找它。

如果您有泄漏并且不知道泄漏了什么,这会有所帮助:

http://mg.pov.lt/objgraph.py http://mg.pov.lt/blog/hunting-python-memleaks http://mg.pov.lt/blog/python-object-graphs.html

它是检查模块的薄包装;如果您有难以跟踪的不需要的引用,它会很有帮助。但是,对于仅跟踪参考, gc.get_referrers 可能就是您所需要的。

于 2009-07-14T21:06:00.650 回答