Python 垃圾回收機制詳解
- 學習教育
- 關注:8.86K次
Python 的GC模組主要運用了引用計數來跟蹤和回收垃圾;通過“標記-清除”解決容器物件可能產生的迴圈引用問題;通過分代回收以空間換時間進一步提高垃圾回收的效率。
也即採用“引用計數“為主(實時性,一旦沒有引用,記憶體就直接釋放了),“標記-清除”與“分代收集”兩種機制為輔的策略。
1. 引用計數
為每一個物件維護一個引用計數器,當一個物件的引用被建立或者複製時,(物件的引用)計數器+1,當一個物件的引用被銷燬時,計數器的值-1,當計數器的值為0時,就意味著物件已經再沒有被使用了,可以將其記憶體釋放掉。
2. 標記-清除
“標記-清除”的出現打破了迴圈引用,也就是它只關注那些可能會產生迴圈引用的物件,Python中的迴圈引用總是發生在容器container物件之間,也就是能夠在內部持有其他物件的物件(比如:list、dict、class等)。這也使得該方法帶來的開銷只依賴於容器物件的數量。
原理:
將集合中物件的引用計數複製一份副本,用於找尋root object集合(該set中的物件是不能被回收的)。當成功找到root object集合,首先將現在的記憶體連結串列一分為二,一條連結串列維護root object集合,成為root連結串列;另外一條維護剩下的物件,成為unreachable連結串列。
一旦在標記的過程中,發現現在在unreachable連結串列且可能存在被root連結串列中直接或間接引用的物件,就將其從unreachable連結串列中移到root連結串列中;當完成標記後,unreachable連結串列中剩下的所有物件就是垃圾物件了,接下來的垃圾回收只需限制在unreachable連結串列中即可。
缺點:
該機制所帶來的額外操作和需要回收的記憶體塊成正比。
3. 分代回收
活的越長的物件,就越不可能是垃圾,就應該減少對它的垃圾收集頻率。
4. 其他
4.1 JNI(Java Native Interface)
提供了若干的API,實現Java與其他語言的通訊。
總結
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注好二三四的更多內容!
- 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/xuexijiaoyu/lre9xz.html