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與其他語言的通信。
總結本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注好二三四的更多內容!