Python的垃圾收集(Python garbage collection)

2019-06-24 00:40发布

我创建了一个循环创建一个对象的一些Python代码,并在每次迭代覆盖具有相同类型的新的这个对象。 这样做是10.000倍,和Python占用的内存每秒7MB,直到我的3GB内存使用。 有谁知道的方式从内存中删除的对象?

Answer 1:

您没有提供足够的信息 - 这取决于你正在创建的对象,还有什么你用它做在循环的细节。 如果对象不创建循环引用,它应该对下一次迭代被释放。 例如,代码

for x in range(100000):
  obj = " " * 10000000

不会导致不断增加的内存分配。



Answer 2:

我认为这是循环引用(虽然这个问题不明确这方面的信息。)

解决这个问题的方法之一是手动调用垃圾收集。 当你手动运行垃圾收集器,它会扫循环引用的对象了。

import gc

for i in xrange(10000):
    j = myObj()
    processObj(j)
    #assuming count reference is not zero but still
    #object won't remain usable after the iteration

    if !(i%100):
        gc.collect()

这里不运行垃圾收集器过于频繁,因为它有自己的开销,例如,如果你在每一个循环中运行的垃圾收集器,解释将变得非常慢。



Answer 3:

这是在Python 2.5的一些类型的纠正一个古老的错误。 正在发生的事情是,蟒蛇是不是在收集之类的空列表/词典/ tupes /花车/整数那么好。 在Python 2.5中这是固定的...居多。 然而花车和整数是比较单身所以一旦其中的一个被创建只要解释是活着总是在那里。 有大量的漂浮物打交道时,我一直在咬伤这种最坏,因为他们拥有的是唯一的一个坏习惯。 这是其特征为Python 2.4和更新的关于它被折叠到蟒2.5

我周围找到的最好的办法是升级到Python 2.5或更高版本采取列表/词典/元组问题的关心。 对于数字唯一的解决办法是不要让大量的数字进入蟒蛇。 我用我自己的包装,以C ++对象做了,但我有numpy.array会给类似的结果的印象。

作为一个后脚本我不知道发生了什么事这在Python 3,但我怀疑数字仍然是一个单独的部分。 所以内存泄漏实际上是语言的一个特征。



Answer 4:

如果您要创建循环引用,你的对象不会立即释放,但必须等待GC周期运行。

您可以使用weakref使用后模块来解决这个问题,或者明确地删除你的对象。



Answer 5:

我发现,在我的情况(与Python 2.5.1),与包括有类圆形引用__del__()方法,不仅是垃圾收集不及时发生, __del__()我对象的方法从来没有得到所谓的即使脚本退出。 所以我用weakref打破循环引用,一切都很好。

荣誉给谁万里提供的所有信息在他的评论让我把这个在一起。



Answer 6:

这里有一两件事你可以在REPL做强制变量的解引用:

>>> x = 5
>>> x
5
>>> del x
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined


Answer 7:

weakref可用于圆形的物体的结构化代码作为解释的示例



文章来源: Python garbage collection