當前位置:
首頁 > 知識 > Python垃圾回收機制 總結

Python垃圾回收機制 總結


Python 垃圾回收機制

內存管理

Python中的內存管理機制的層次結構提供了4層,其中最底層則是C運行的mallocfree介面,往上的三層才是由Python實現並且維護的,第一層則是在第0層的基礎之上對其提供的介面進行了統一的封裝,因為每個系統都可能差異性。

Python垃圾回收機制 總結

內存池

Python為了避免頻繁的申請和刪除內存所造成系統切換於用戶態和核心態的性能問題,從而引入了內存池機制,專門用來管理小內存的申請和釋放。內存池分為四層:block、pool、arena和內存池。如下圖:

Python垃圾回收機制 總結

  • block:有很多種block,不同種類的block都有不同的內存大小,申請內存的時候只需要找到適合自身大小的block即可,當然申請的內存也是存在一個上限,如果超過這個上限,則退化到使用最底層的malloc進行申請

  • pool:一個pool管理著一堆有固定大小的內存塊,其大小通常為一個系統內存頁的大小。

  • arena:多個pool組合成一個arena。

  • 內存池:一個整體的概念。

垃圾回收

Python的GC模塊主要運用了引用計數來跟蹤和回收垃圾。在引用計數的基礎上,還可以通過「標記-清除」解決容器對象可能產生的循環引用的問題。通過分代回收以空間換取時間進一步提高垃圾回收的效率。

引用計數

原理:當一個對象的引用被創建或者複製時,對象的引用計數加1;當一個對象的引用被銷毀時,對象的引用計數減1,當對象的引用計數減少為0時,就意味著對象已經再沒有被使用了,可以將其內存釋放掉。

優點:引用計數有一個很大的優點,即實時性,任何內存,一旦沒有指向它的引用,就會被立即回收,而其他的垃圾收集技術必須在某種特殊條件下才能進行無效內存的回收。

缺點:但是它也有弱點,引用計數機制所帶來的維護引用計數的額外操作與Python運行中所進行的內存分配和釋放,引用賦值的次數是成正比的,這顯然比其它那些垃圾收集技術所帶來的額外操作只是與待回收的內存數量有關的效率要高。同時,引用技術還存在另外一個很大的問題-循環引用,因為對象之間相互引用,每個對象的引用都不會為0,所以這些對象所佔用的內存始終都不會被釋放掉。如下:

Python垃圾回收機制 總結

標記-清除

標記-清除的出現打破了循環引用,也就是它只關注那些可能會產生循環引用的對象,顯然,像是PyIntObject、PyStringObject這些不可變對象是不可能產生循環引用的,因為它們內部不可能持有其它對象的引用。Python中的循環引用總是發生在container對象之間,也就是能夠在內部持有其它對象的對象,比如list、dict、class等等。這也使得該方法帶來的開銷只依賴於container對象的的數量。

原理:將集合中對象的引用計數複製一份副本,這個計數副本的作用是尋找root object集合(該集合中的對象是不能被回收的)。當成功尋找到root object集合之後,首先將現在的內存鏈表一分為二,一條鏈表中維護root object集合,成為root鏈表,而另外一條鏈表中維護剩下的對象,成為unreachable鏈表。一旦在標記的過程中,發現現在的unreachable可能存在被root鏈表中直接或間接引用的對象,就將其從unreachable鏈表中移到root鏈表中;當完成標記後,unreachable鏈表中剩下的所有對象就是名副其實的垃圾對象了,接下來的垃圾回收只需限制在unreachable鏈表中即可。

缺點:該機制所帶來的額外操作和需要回收的內存塊成正比。

分代

原理:將系統中的所有內存塊根據其存活時間劃分為不同的集合,每一個集合就成為一個「代」,垃圾收集的頻率隨著「代」的存活時間的增大而減小。也就是說,活得越長的對象,就越不可能是垃圾,就應該減少對它的垃圾收集頻率。那麼如何來衡量這個存活時間:通常是利用幾次垃圾收集動作來衡量,如果一個對象經過的垃圾收集次數越多,可以得出:該對象存活時間就越長。

文章摘自博客園


更多精彩推薦:

IT職業教育:http://www.ujiuye.com/

更多知識學習:http://www.ujiuye.com/zt/webqianduan/?wt.db=lsh11tt

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

CSS:transition過渡放在偽類中與應用的區別
自製刻度尺-前端簡易實現「信用」界面
js數組遍歷和對象遍歷

TAG:IT優就業 |

您可能感興趣

Python 和 Ruby 的分代垃圾回收機制
android 結合源碼深入剖析AsyncTask機制原理
劫持者可以繞過 Active Directory 控制機制
為什麼 Android 要採用 Binder 作為 IPC 機制?
阿里開源富容器引擎 PouchContainer的network 連接機制
Android 消息機制—ThreadLocal
PHP的session的實現機制
Cloud Foundry架構和消息處理機制
OpenStack-Neutron的資源隔離機制
SpringCloud如何實現Eureka集群、HA機制?
在TensorFlow+Keras環境下使用RoI池化一步步實現注意力機制
Spring AOP 的實現機制
Cellular Microbiology:流感病毒調控宿主細胞周期的新機制
HDFS BlockToken機制解析
Physics World專欄:動物集體行為背後,到底是何機制?
python greenlet 背景介紹與實現機制
Ceph存儲系統Scrub機制分析
《Science Advances》Highlights重磅!應用賽特SE-iFISH揭秘乳腺癌轉移機制
Nature Communications 最新研究揭示調控種子休眠和萌發的新機制
Kubernetes存儲系統介紹及機制實現