【问题标题】:Python gc.get_referents() returning references that are unknown to inspect modulePython gc.get_referents() 返回检查模块未知的引用
【发布时间】:2014-09-11 13:52:23
【问题描述】:

我正在尝试调试内存泄漏并将其追踪到单个对象,将其称为“父对象”。

gc.get_referents(parent) 表明它正在有效地获得越来越多的对泄漏对象的引用。我试图找出更多关于它是如何发生的信息,但是,inspect.getmembers(parent) 对 gc.get_referents 确实知道的这些引用一无所知:

import gc
import inspect

parent = someObject()
dependents = gc.get_referents(parent)
fromInspect = [b for (a,b) in inspect.getmembers(parent) if b in dependents]
notFromInspect = [b for (a,b) in inspect.getmembers(parent) if b not in dependents]
print len(fromInspect)
>>> 3
print len(notFromInspect)
>>> 69

所以有很多对象(其中 69 个!) gc 模块知道,但 inspect 不知道。

gc.get_referents() 如何为 Python 对象构造“引用”对象列表?

我需要查看插槽吗?还有什么?

【问题讨论】:

    标签: python memory-leaks garbage-collection


    【解决方案1】:

    在我的例子中,“父”是一个用 C/C++ 实现的自定义 python 对象。

    此处的文档描述了如何在 Python 中编写自己的“容器”对象:https://docs.python.org/2/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC

    这些对象与垃圾收集器接口所要做的就是提供两个函数指针,tp_traversetp_clear

    tp_traverse 允许自定义类型对象告诉垃圾收集器它想要的关于该对象拥有哪些对象的任何信息。

    因此,就我而言,这就是我看到 inspect 模块未知的引用的方式。

    对我来说不幸的是,我仍然没有找到泄漏的实际原因 - 除了现在我知道它与 C/C++ 代码有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2010-09-26
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多