在哪里调用gc.collect()

时间:2014-11-05 16:09:24

标签: python memory-management memory-leaks garbage-collection

我应该在哪里打电话给垃圾收集器?调用函数后调用它会清除被调用函数的内存吗?

调用gc.collect()和在变量上专门做del之间的区别是什么

def a():
    b()
    # should I call gc.collect() here?
    # is there any other way to release memory allocated in the called function here?

def b():
    # big allocation like
    foo = ['abc' for x in range(10**7)]

    # should I call gc.collect() here?
    # should I do a foo = None and x = None here?

2 个答案:

答案 0 :(得分:0)

你应该来调用它。

垃圾收集器仅用于清除引用计数机制未释放的循环引用。它不会修复你的内存不足问题;如果你有内存泄漏,你应该解决这个问题。

答案 1 :(得分:0)

大多数情况下,您无需致电gc.collect()。 Python会不时自动收集垃圾,特别是当内存不足时。更重要的是,当你内存不足时调用任何东西可能无法正常工作,因为调用任何函数会占用堆栈帧的一些内存。

del不会删除对象,它会删除变量。如果多个变量引用同一个对象,del将只删除其中一个引用。当对它们的所有引用都消失(立即),或者剩下的唯一引用形成一个无法访问的对象循环时(在下一个垃圾收集中),对象将被删除。

如果内存不足,则可能意味着通过保持对超过必要的引用来保持对象的活动。局部变量在超出范围时会自动删除(例如,当函数返回时),但全局变量往往会永久存在。类级变量也趋于延续:

class Foo(object):
    bar = some_big_expensive_object