为什么禁用垃圾收集器?

时间:2013-12-10 13:32:43

标签: python garbage-collection

Pythons gc.disable禁用自动垃圾收集。据我了解,这会产生一些副作用。为什么有人想要禁用自动垃圾收集,如何在没有它的情况下有效地管理内存呢?

4 个答案:

答案 0 :(得分:19)

禁用垃圾收集器的一个用途是在计算代码性能时获得更一致的结果。 The timeit module这样做。

def timeit(self, number=default_number):
    if itertools:
        it = itertools.repeat(None, number)
    else:
        it = [None] * number
    gcold = gc.isenabled()
    gc.disable()
    ...

In Python2以及Python3.2 gc.disable()也用于避免a bug caused by garbage collection occurring between fork and exec。问题似乎已在Python3.3中修复,无需拨打gc.disable()

答案 1 :(得分:7)

从您链接到的相同页面:

  

由于收集器补充了已经使用的引用计数   Python,如果你确定你的程序,你可以禁用收集器   不会创建参考周期。

这样就回答了问题的第二部分,"如何在没有它的情况下有效地管理内存"。不要创建参考周期。当然,这是一个相当有限的用例。

对于问题的第一部分,答案是表现。同样,一个相当有限的用例。

禁用GC只会在以下情况下有所帮助:(a)GC实际上正在开展工作,(b)工作没有取得任何成果,也就是说它没有找到任何可以解放的东西,或者找不到你认为的那么多只要GC被禁用,您的程序就可以容忍泄漏。因此,如果您的程序太慢并且没有创建参考周期并且禁用GC似乎加速了它,那么您会考虑禁用GC。

我推测(根据以前的GC,我已经看过,特别是Python不是),如果你没有分配任何内存,那么垃圾收集器就没有多长时间了性能成本。它可能会有一些短期和不可预测的成本,可以整理以前的成本。因此,即使您正在进行大规模numpy数字运算程序,并认为您应该从代码的那一部分中挤出所有可能的性能,但在执行此操作时禁用GC仍然不会#39; t帮助。在重新启用GC之前,它只会延迟整理先前参考周期的时间成本。

可以说,运行时间短且不使用大量内存的程序不需要垃圾回收,它们可以容忍泄漏。但更有说服力的是,如果你开始这么想,你最终会遇到一个泄漏了比预期更多的内存的程序。

答案 2 :(得分:6)

启用GC的问题始终是何时会发生。因此,如果您的程序(部分)是时间关键的,需要实时等,那么您可以在程序运行的时间(该部分)中禁用GC。

是否要稍后再次启用自动GC,或者如果您希望通过调用gc.collect()手动执行此操作,则无关紧要。

此外,某些程序只能在很短的时间内运行,因此开发人员可以确保在此期间不会出现任何内存问题(考虑ls之类的程序);然后可以忽略整个GC方面以支持性能。

答案 3 :(得分:3)

另一个用例是使用gc.collect()

手动控制垃圾收集