Python gc.get_referents() 返回 inspect 模块未知的引用
我正在尝试找出一个内存泄漏的问题,结果发现问题出在一个叫“parent”的对象上。
通过使用 gc.get_referents(parent)
,我发现这个对象似乎不断地获得更多的引用,也就是有其他地方在使用它。现在我想了解更多关于这些引用的信息,但用 inspect.getmembers(parent)
却查不到这些引用的信息:
也就是说,
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
gc模块知道有很多对象(总共有69个!),但inspect模块却不知道这些对象。
那么,gc.get_referents()
是怎么构建出一个Python对象的“引用对象”列表的呢?
我需要查看槽(slots)吗?还是其他什么东西?
1 个回答
0
在我的情况下,"parent" 实际上是一个用 C/C++ 实现的自定义 Python 对象。
这里的文档介绍了如何在 Python 中编写你自己的 "容器" 对象:https://docs.python.org/2/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC
这些对象只需要提供两个函数指针,就可以和垃圾回收器(负责清理不再使用的内存)进行交互,分别是 tp_traverse
和 tp_clear
。
tp_traverse
允许自定义类型对象告诉垃圾回收器它所拥有的对象的信息。
所以在我的情况下,这就是我看到一些 inspect
模块不知道的引用的原因。
对我来说不幸的是,我仍然没有找到内存泄漏的实际原因——不过现在我知道这和 C/C++ 代码有关。