網站首頁 學習教育 IT科技 金融知識 旅遊規劃 生活小知識 家鄉美食 養生小知識 健身運動 美容百科 遊戲知識 綜合知識
當前位置:趣知科普吧 > 學習教育 > 

Python 垃圾回收機制詳解

欄目: 學習教育 / 發佈於: / 人氣:9.1K

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與其他語言的通信。

總結

本篇文章就到這裏了,希望能夠給你帶來幫助,也希望您能夠多多關注好二三四的更多內容!