python的GC
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
相關文章
- Full GC (Metadata GC Threshold)GC
- 從CLR GC到CoreCLR GCGC
- GCGC
- GC.MaxGeneration屬性【GC示例】GC
- JVM的GC日誌JVMGC
- GC是什麼?為什麼要有GC?GC
- JVM 系列文章之 Full GC 和 Minor GCJVMGC
- Go GC 機制的大坑GoGC
- 聊一聊 JVM 的 GCJVMGC
- 透過一次GC調整使Python速度提高20%GCPython
- 總結Minor GC、Full GC觸發條件GC
- java GC CollectorJavaGC
- gc buffer busyGC
- gc 檢視GC
- .Net Core 中GC的工作原理GC
- GO的GC辣雞回收(一)GoGC
- .Net平臺的GC垃圾回收GC
- Python垃圾回收(GC)三層心法,你瞭解到第幾層?PythonGC
- 什麼是垃圾蒐集(GC)?為什麼要有GC呢?GC
- java中什麼樣的物件才能作為gc root物件,gc root物件有哪些Java物件GC
- Unity GC垃圾回收UnityGC
- GC垃圾回收器GC
- JVM記憶體GC的騙局JVM記憶體GC
- GC的四種清理演算法GC演算法
- 聊聊JVM的垃圾回收機制GCJVMGC
- golang gc的內部最佳化GolangGC
- JVM的四種GC演算法JVMGC演算法
- 圖解Golang的GC演算法圖解GolangGC演算法
- 淺談對java-GC的理解JavaGC
- 頻繁GC (Allocation Failure)及young gc時間過長分析GCAI
- 【JVM第八篇--垃圾回收】GC和GC演算法JVMGC演算法
- jvm hotspot的minor major full gc之間的關係,以及哪些情況下會觸發full gcJVMHotSpotGC
- JVM垃圾回收——新生代,老年代,永久代,Minor GC,Full GCJVMGC
- eclipse設定檢視GC日誌和如何理解GC日誌EclipseGC
- 對一次 GC日誌的分析GC
- Go記憶體分配和GC的理解Go記憶體GC
- Java出現一個新的GC:LXRJavaGC
- JVM GC日誌解析JVMGC