你認為垃圾回收器可以跟蹤所有 Python 物件嗎?
Python 使用兩種技術來清理垃圾。一種是引用計數,它影響所有物件,但無法清理直接或間接相互引用的物件。這就是實際的垃圾回收器發揮作用的地方:python 有 gc 模組,它搜尋其已知物件中的迴圈引用。只有可能成為引用迴圈一部分的物件才會參與迴圈 gc。因此,例如,列表會參與,但字串不會;字串不引用任何其他物件。
所有 Python 類及其例項都會自動被迴圈 gc 跟蹤。在 C 中定義的型別不會,除非它們付出一些努力。所有可能成為迴圈一部分的內建型別都會。但這確實意味著 gc 模組只知道那些配合的型別。
除了收集機制之外,還有這樣一個事實,即 Python 有自己的聚合記憶體分配器 (obmalloc),它分配整個記憶體區域並使用該記憶體來建立它建立的大多數較小的物件。Python 現在確實會在這些區域完全為空時釋放這些區域(很長一段時間它都沒有這樣做),但實際上清空一個區域是相當罕見的:因為 Python 物件不可移動,所以您不能只是將一些滯留物件移動到另一個區域。
廣告