你認為垃圾回收器能夠追蹤所有Python物件嗎?


Python 使用兩種技術來清理垃圾。一種是引用計數,它影響所有物件,但不能清理直接或間接相互引用的物件。這就是實際的垃圾回收器發揮作用的地方:python 有 gc 模組,它搜尋其已知物件中的迴圈引用。只有可能成為迴圈引用一部分的物件才會參與迴圈 gc。例如,列表會參與,但字串不會;字串不引用任何其他物件。

所有 Python 類及其例項都會自動被迴圈 gc 追蹤。除非付出一些努力,否則在 C 中定義的型別不會被追蹤。所有可能成為迴圈一部分的內建型別都會被追蹤。但這確實意味著 gc 模組只知道那些參與其中的型別。

除了收集機制之外,Python 還擁有自己的聚合記憶體分配器 (obmalloc),它分配整個記憶體區域,並將記憶體用於其建立的大多數較小的物件。Python 現在確實會在這些區域完全為空時釋放它們(很長一段時間它都沒有這樣做),但實際上清空一個區域的情況相當罕見:因為 Python 物件不可移動,所以你不能只將一些剩餘的物件移動到另一個區域。

更新於:2019年7月30日

124 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告