當前位置:生活全書館 >

學習教育

> Python 垃圾回收機制詳解

Python 垃圾回收機制詳解

Python 垃圾回收機制詳解

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