python的GC

weixin_34075551發表於2018-08-01

python垃圾回收機制

Python GC 主要是引用計數來跟蹤和回收垃圾。 在引用技數的基礎上, 通過"標記-清除"解決容器可能產生的迴圈引用問題, 通過過"分代回收"以空間換時間的方法提高垃圾回收效率。

引用計數

Pyobject 是每個物件必有的內容, 其中ob_refcnt就是做為引用計數。 當一個物件有新的引用時, 它的ob_refcnt就會增加,當引用它的物件被刪除, 它的ob_refcent就會減少, 引用計數為0時, 該物件生命就結束了。
優點:簡單, 實時性
缺點: 維護引用計數消耗資源, 迴圈引用

標記清除

基本思路是先按需分配, 等到沒有空閒記憶體的時候從暫存器和程式棧上的引用出發,遍歷以物件為節點,以引用為邊構成的圖, 把所有可以訪問到的物件打上標記, 然後清除一邊記憶體空間, 把所有沒標記的物件釋放。

分代技術

分代回收的整體思想是:將系統中的所有記憶體根據其存活時間劃分為不同的集合,每個集合就成為一個"代", 垃圾收集頻率隨著"代"的存活時間的增大而減小, 存活時間通常利用經過幾次垃圾回收來度量。
Pyhon預設定義了三代物件集合, 索引數越大, 物件存活時間越長。

舉例: 當某些記憶體塊M經過了3次垃圾收集的清洗之後還存活時,我們就將記憶體塊M劃到一個集合A中去,而新分配的記憶體都劃分到集合B中去。當垃圾收集開始工作時,大多數情況都只對集合B進行垃圾回收,而對集合A進行垃圾回收要隔相當長一段時間後才進行,這就使得垃圾收集機制需要處理的記憶體少了,效率自然就提高了。在這個過程中,集合B中的某些記憶體塊由於存活時間長而會被轉移到集合A中,當然,集合A中實際上也存在一些垃圾,這些垃圾的回收會因為這種分代的機制而被延遲。
轉載:
https://github.com/taizilongxu/interview_python#unix%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E6%96%B9%E5%BC%8Fipc

相關文章