【问题标题】:Python object has no referrers but still accessible via a weakref?Python 对象没有引用但仍可通过弱引用访问?
【发布时间】:2009-07-14 20:29:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请给出一个简单的代码示例。否则不清楚你的意思。弱引用本身是可访问的,还是被引用对象本身可以通过弱引用访问?
  • 您是如何找到带有引用的变量的?我正试图追踪这样的泄漏,但它是间歇性的,并且 gc.get_referrers 正在返回 []。有没有办法找到对象的“本地”引用在哪里?

标签: python garbage-collection cpython


【解决方案1】:

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

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

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

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

【讨论】:

  • 我仍然通过我的弱引用获得一个对象实例,而我期望的是 None。
  • 您确定其他地方没有强参考吗?垃圾收集也不是自动的(即使有引用计数,如果有一个引用循环,它们会等到使用不同的垃圾收集算法)
  • 是的,但要持续多久?永远?即,您让程序运行很长时间,并且对象从不收集? Python 的 GC 是分代的,因此收集对象可能需要一些时间。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

      作为Christopher says,弱引用不计入对象引用计数,因此无法阻止 Python 删除对象。

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

      【讨论】:

      • gc.garbage 在调用 gc.collect() 后是一个空列表 - 对象及其超类都没有定义 del。循环引用是否可以通过 gc.get_referrers() 返回的列表来识别?
      【解决方案5】:

      如果您确实对该对象有强引用,请使用 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 可能就是您所需要的。

      【讨论】:

        猜你喜欢
        • 2022-07-10
        • 2018-04-17
        • 1970-01-01
        • 2017-02-24
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        相关资源
        最近更新 更多