管理垃圾收集

有兩種方法可以影響執行記憶體清理的時間。它們影響自動過程的執行頻率,另一個是手動觸發清理。

可以通過調整影響收集器執行頻率的收集閾值來操作垃圾收集器。Python 使用基於代的記憶體管理系統。新物件儲存在最新一代 - generation0 中,每個倖存的集合中,物件都被提升為老一代。到達上一代 - 第二代後,他們不再升職。

可以使用以下程式碼段更改閾值:

import gc
gc.set_threshold(1000, 100, 10) # Values are just for demonstration purpose

第一個參數列示收集 generation0 的閾值。每次分配數量超過解除分配數量 1000 時,將呼叫垃圾收集器。

每次執行都不會清除老一代以優化過程。第二個和第三個引數是可選的,可以控制清除舊代的頻率。如果 generation0 進行處理 100 次不清洗 generation1 ,然後 generation1 將被處理。類似地,在物件第二代將僅當在的那些處理 generation1 進行清洗 10 次而不接觸第二代

手動設定閾值有益的一個例項是當程式分配大量小物件而不解除分配時導致垃圾收集器過於頻繁地執行(每個 generation0_threshold 物件分配)。即使收集器非常快,當它執行在大量物件上時,它會帶來效能問題。無論如何,選擇閾值並沒有一個尺寸適合所有策略,它的用例是可靠的。

手動觸發集合可以在以下程式碼段中完成:

import gc
gc.collect()

根據分配和解除分配的數量自動觸發垃圾收集,而不是根據消耗或可用記憶體。因此,在處理大物件時,在觸發自動清理之前記憶體可能會耗盡。這是手動呼叫垃圾收集器的一個很好的用例。

雖然這是可能的,但這並不是一種鼓勵的做法。避免記憶體洩漏是最佳選擇。無論如何,在大專案中檢測記憶體洩漏可能是一項任務,並且手動觸發垃圾收集可以用作快速解決方案,直到進一步除錯。

對於長時間執行的程式,可以按時間或基於事件觸發垃圾收集。第一個示例是一個 Web 伺服器,它在固定數量的請求之後觸發集合。對於後者,在收到某種型別的請求時觸發垃圾收集的 Web 伺服器。