在哪里调用gc.collect()函数?

5

我应该在哪里调用垃圾回收器?在函数被调用后调用它是否会清除被调用函数的内存?

此外,调用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?

为什么你想要调用它? - mmmmmm
我想称之为从另一个函数(a)调用的某些函数(b),在我的Heroku应用程序上,我得到了内存不足错误。 - dowjones123
2个回答

3
大多数情况下,您不需要调用gc.collect()。Python会定期自动回收垃圾,特别是在内存不足时。此外,在内存不足时调用任何函数可能无法正常工作,因为调用任何函数都会为堆栈帧消耗一些内存。 del不会删除对象,它会删除变量。如果多个变量引用同一个对象,则del只会删除其中一个引用。当所有引用都消失(立即)或剩余的唯一引用形成不可达对象循环(在下一次垃圾回收时)时,对象将被删除。
如果您的内存不足,这可能意味着您通过将对它们的引用保留更长时间而使对象保持活动状态。当局部变量超出范围时(例如,当函数返回时),它们会自动删除,但全局变量往往会永久存在。类级别的变量也往往会持续存在:
class Foo(object):
    bar = some_big_expensive_object

2
你不应该去调用它。
垃圾收集器只用来清除被引用计数机制未释放的循环引用对象。如果你的程序存在内存泄漏,它并不能解决你的内存溢出问题;你需要修复内存泄漏问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接