2014-11-05 106 views
2

我應該在哪裏調用垃圾回收器?在函數被調用清除被調用函數的內存之後調用它嗎?打電話給gc.collect()

也就是調用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? 
+0

爲什麼要打電話給它? – Mark 2014-11-05 16:10:49

+0

我想調用它,因爲我看到對於某些函數(b),我從另一個函數(a)調用,在我的heroku應用程序中,出現內存不足錯誤 – dowjones123 2014-11-05 16:12:14

回答

0

你應該稱它爲之間的差異。

垃圾回收器僅用於清除未由引用計數機制釋放的循環引用。它不會解決你的內存不足問題;如果你有內存泄漏,你應該修復它。

0

大多數情況下,您不需要撥打gc.collect()。 Python不時自動收集垃圾,特別是當內存不足時。更重要的是,當內存不足時調用任何東西可能無法正常工作,因爲調用任何函數都會爲堆棧幀消耗一些內存。

del不刪除對象,它刪除變量。如果多個變量引用同一個對象,則del將只刪除其中一個引用。當所有對它們的引用都消失(立即)時,或者當剩下的唯一引用形成一個不可達對象的循環(在下一次垃圾收集時)時,對象被刪除。

如果內存不足,可能意味着您要保持對象的引用時間長於必要的時間。局部變量在超出範圍時會自動刪除(例如,當函數返回時),但全局變量往往會永遠存在。級別變量也傾向於留戀:

class Foo(object): 
    bar = some_big_expensive_object