python中的GC機制
阿新 • • 發佈:2019-02-12
和java一樣 python也有垃圾自動回收機制,但實現方法與java並不相同
python中以引用計數為主,零代為輔
1 引用計數機制
python裡每一個東西都是物件,它們的核心就是一個結構體:PyObject
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
PyObject是每個物件必有的內容,其中ob_refcnt就是做為引用計數。當一個物件有新的引用時,它的ob_refcnt就會增加,當引用它的物件被刪除,它的ob_refcnt就會減少
如果一個物件的引用數量降為0,會立即釋放佔用的記憶體
引用計數機制的優點:
- 簡單
- 實時性 即一旦沒有引用,記憶體就直接釋放了。不用像其他機制等到特定時機。實時性還帶來一個好處:處理回收記憶體的時間分攤到了平時。
引用計數機制的缺點:
- 維護引用計數消耗資源,在物件內部保留一小部分空間用以儲存引用數,同時在操作大量資料時不得不耗費精力處理每個物件的引用數
- 引用計數不能處理環形資料結構–也就是含有迴圈引用的資料結構。
第一個缺點在當前硬體條件下並不明顯,但第二個在某些情況下卻是致命危險,可能引起記憶體洩露,所以python又引入了標記清除和分代回收
2 孤立引用環
瞭解不多,日後填寫
3 分代回收
也叫零代回收(Generation Zero)或隔代回收,基本思想是 大部分物件生命期很短,對年輕代和老年代使用不同的演算法可以提高效率。 新創建出來的物件放在零代連結串列上,經過一段時間後gc檢測零代連結串列中是否有迴圈引用,有則引用計數減1,當引用計數為0時釋放記憶體,大於0且沒有迴圈引用之後會將物件放入一代連結串列,再經過一段時間後檢查一代放入三代。這就是新生代和老年代