Python gc.get_referents() 返回 inspect 模块未知的引用

0 投票
1 回答
552 浏览
提问于 2025-04-21 02:44

我正在尝试找出一个内存泄漏的问题,结果发现问题出在一个叫“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_traversetp_clear

tp_traverse 允许自定义类型对象告诉垃圾回收器它所拥有的对象的信息。

所以在我的情况下,这就是我看到一些 inspect 模块不知道的引用的原因。

对我来说不幸的是,我仍然没有找到内存泄漏的实际原因——不过现在我知道这和 C/C++ 代码有关。

撰写回答