引用计数作为垃圾收集方法会导致Python中的内存泄漏吗?

时间:2015-12-01 00:02:27

标签: python memory-leaks garbage-collection circular-reference reference-counting

来自this讨论:

  

例如以下代码

 class A: pass 
 a=A() 
 a.b=a 
     

导致任何python程序中的内存泄漏。

请您准确解释幕后问题以及如何预防?

2 个答案:

答案 0 :(得分:1)

引用计数不会释放该对象,因为它的引用计数永远不会为零。你所拥有的是一个循环引用的例子(其中一个对象包含对自身的引用,或指向另一个指向它的对象,等等),引用计数根本不是解决该问题的正确方法。

(为了真正说明问题,你可能应该将del a作为最后一行,但我们会让那个幻灯片......)

在任何情况下,这就是为什么Python除了引用计数之外还有一个实际的垃圾收集器,它可以找到并释放无法访问的内存。因此,即使以前称为a的对象最终也会被收集,它可能不会立即发生。

其他Python实现可能使用不同的内存管理策略。例如,Jython和IronPython分别使用其底层VM,Java虚拟机和.Net CLR的内存管理。

答案 1 :(得分:1)

在Python1.x中,情况看起来像这样

class A: pass 

1引用A

a=A() 

2个引用A,1个引用A的实例

a.b=a 

2个引用A,2引用同一个A

实例
del a

引用A,1(不可访问)引用我们的A实例

这就是泄露内存的意思

Python自2000年以来就有了一个循环垃圾收集器,因此这将(通常)找到无法访问的引用并将其释放。