簡體   English   中英

為什么禁用垃圾收集器?

[英]Why disable the garbage collector?

Pythons gc.disable禁用自動垃圾收集。 據我了解,這會產生一些副作用。 為什么有人想要禁用自動垃圾收集,如何在沒有自動垃圾收集的情況下有效管理內存?

禁用垃圾收集器的一個用途是在計算代碼性能時獲得更一致的結果。 timeit模塊執行此操作。

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

在Python2Python3.2中, gc.disable()也用於避免forkexec之間發生的垃圾收集引起的錯誤 這個問題似乎已在Python3.3中修復,無需調用gc.disable()

在您鏈接到的同一頁面上:

由於收集器補充了Python中已經使用的引用計數,因此如果您確定程序不創建引用循環,則可以禁用收集器。

所以這回答了問題的第二部分,“如何在沒有它的情況下有效地管理記憶”。 不要創建參考周期。 當然,這是一個相當有限的用例。

對於問題的第一部分,答案是表現。 同樣,一個相當有限的用例。

禁用GC只會在以下情況下有所幫助:(a)GC實際上正在工作,(b)工作沒有實現任何目的,也就是說它沒有找到任何可以解放的東西,或者發現你認為你的程序可以容忍泄漏只要GC被禁用。 因此,如果您的程序太慢並且沒有創建參考周期並且禁用GC似乎加速了它,那么您將考慮禁用GC。

我推測(基於我之前見過的GC,特別是Python),如果你沒有分配任何內存,那么垃圾收集器將不會有任何長期的性能成本。 它可能會有一些短期和不可預測的成本,可以整理以前的成本。 因此,即使在你進入一個巨大的情況下numpy數字運算程序,並認為你應該看看擠一切可能表現出來的那部分代碼的,禁用GC,而你做它仍然不會有所幫助。 它只會延遲整理先前參考周期的時間成本,直到重新啟用GC為止。

可以說,運行時間短且不占用大量內存的程序不需要垃圾回收,它們可以容忍泄漏。 但更有說服力的是,如果你開始這樣思考,你最終會遇到一個泄漏了比預期更多內存的程序。

啟用GC的問題始終是您不知道何時會發生。 因此,如果您的程序(部分)是時間關鍵的,需要實時等,那么您可以在程序運行的時間(該部分)禁用GC。

是否要稍后再次打開自動GC,或者如果您希望通過調用gc.collect()手動執行此操作,則該問題gc.collect()

此外,一些程序設計為只運行很短的時間,因此開發人員可以確保在此期間不會出現任何內存問題(考慮像ls這樣的程序); 然后可以忽略整個GC方面以支持性能。

另一個用例是使用gc.collect()手動控制垃圾回收

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM