【问题标题】:diagnosing memory leak in python诊断python中的内存泄漏
【发布时间】:2012-10-09 07:53:20
【问题描述】:

我一直在尝试使用 objgraph 调试 Coopr 包中的内存泄漏:https://gist.github.com/3855150

我已将它固定到 _SetContainer 对象,但似乎无法弄清楚为什么该对象会持续存在于内存中。这是objgraph.show_refs 的结果:

如何查找循环引用以及如何让垃圾收集器收集 _SetContainer 实例?

我之前认为类本身可能有一个自引用(上图右侧类正下方的元组)。但是 objgraph 总是将继承的类显示为具有自引用元组。可以看到一个很简单的测试用例here

【问题讨论】:

  • [, {'and': and at 0x7928f0>, ..., 'union': }, (, , , , ), ( ,), ]
  • 使用pprint(gc.get_referents(obj.__class__))。自引用元组在那里,但没有给出它的属性名称。

标签: python memory-leaks objgraph


【解决方案1】:

这主要是从objgraph的输出中猜测的,但似乎该实例处于一个循环中,并且它的类有一个__del__。在这种情况下,对象在 CPython 中永远保持活动状态。检查它:

import gc; gc.collect(); print gc.garbage

http://docs.python.org/library/gc.html#gc.garbage

【讨论】:

  • print gc.garbage 返回一个空列表,但 count=gc.collect(); 非零。我相信这意味着有无法收集的物品。此外,_SetContainer class(或它继承自的Component class)没有明确定义__del__ 方法。
  • 我收回第二条语句——我刚刚找到了继承的__del__ 方法。
  • 否,gc.collect() 返回已找到并收集的不可达对象的数量。您可能会遇到 gc.collect() 运行不够频繁的情况? (通常,它会不时自动运行。)尝试在程序运行期间显式调用 gc.collect()...
猜你喜欢
  • 2018-10-24
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 2016-04-29
相关资源
最近更新 更多