如何找出代码中存在哪些特定的循环引用

Posted

技术标签:

【中文标题】如何找出代码中存在哪些特定的循环引用【英文标题】:How to find out which specific circular references are present in code 【发布时间】:2015-11-02 02:13:18 【问题描述】:

我有一些 python 代码,其中 gc.collect() 似乎释放了大量内存。鉴于 Python 的引用计数性质,我倾向于认为我的程序包含很多循环引用。由于有些数据结构比较大,我想介绍一下弱引用。现在我需要找到循环引用,找到了一些明显的引用,我想知道是否可以检测到循环引用和明确形成环的对象。到目前为止,我只看到了有关如何调用 gc.collect 等的教程。人。

【问题讨论】:

这些对象有自定义的__del__ 方法吗? 您可能会发现objgraph 包很有用。它将创建对象之间引用的可视化。 Here's a blog post about circular references and objgraph. 我还要提一下,理想情况下,如果可能,您应该首先删除这些循环引用,而不是尝试解决它们:)。 见***.com/questions/508277/… 【参考方案1】:

除非您重写 __del__ 方法,否则您不必担心循环依赖,因为 Python 能够正确处理它们。

【讨论】:

... 直到您尝试使用 python 的多处理并且您的对象不再腌制。 IMO 在设计应用程序时考虑如何避免循环引用是一个好主意,因为它打开了几扇门以在以后优化性能。这与过早优化相同。

以上是关于如何找出代码中存在哪些特定的循环引用的主要内容,如果未能解决你的问题,请参考以下文章

EF6:如何避免循环引用?

【OC梳理】循环引用及解决

python_如何在循环引用中管理内存?

哪些操作会造成内存泄漏?

Java中gcRoot和引用类型

Spring如何处理循环引用