Python GC 中跟踪的任何对象都没有引用者吗?

Posted

技术标签:

【中文标题】Python GC 中跟踪的任何对象都没有引用者吗?【英文标题】:Does any object tracked in Python GC have no referrer? 【发布时间】:2019-03-18 06:25:58 【问题描述】:

我计划验证我的 Python 3.6 代码是否有任何循环引用。

给定一个对象,get_referrers https://docs.python.org/3/library/gc.html#gc.get_referrers 返回引用该对象的所有对象。但是,以下返回 []

[o for o in gc.get_objects() if not bool(gc.get_referrers(o))]

这意味着所有对象都至少有一个引用者。

我还发现https://mg.pov.lt/objgraph/objgraph.html#objgraph.is_proper_module 使用模块作为根。

[o for o in gc.get_objects() if objgraph.is_proper_module(o)]

虽然模块仍然可以相互引用...这是找到根的正确方法吗?

【问题讨论】:

【参考方案1】:

很容易拥有一个 GC 跟踪的对象,而没有 GC 已知的引用者。例如,

>>> gc.get_referrers([1, 2, 3])
[]

没有返回推荐人。 GC 不知道帧对象的值堆栈上的引用(挂起的生成器和协程的帧除外),这是对 [1, 2, 3] 列表的引用的来源。

其他情况包括仅引用存在于 C 全局或局部变量中的对象。

【讨论】:

以上是关于Python GC 中跟踪的任何对象都没有引用者吗?的主要内容,如果未能解决你的问题,请参考以下文章

隐藏实际的链接引用者,如谷歌

调试 Python 致命错误:已跟踪 GC 对象

Java虚拟机:GC算法和种类

确定 GC 释放了哪些 JavaScript 对象

Java方法内创建对象实例后,啥时候释放内存(引

如何在 Python 中使用引用者和 href 查找 url?