Python如何進行記憶體管理的?
阿新 • • 發佈:2018-12-10
Python在進行記憶體管理從三個方面進行:
物件的引用計數機制
Python內部使用引用計數,來保持追蹤記憶體中的物件, 所有物件都有引用計數。
- 引用計數增加的情況:
- 一個物件分配一個新名稱
- 將其放入一個容器中(如列表List,元組tuple和字典dict)
- 引用計數減少的情況:
- 使用del語句對 物件別名顯示的銷燬
- 引用超出作用域或被重新賦值
sys.getrefcount()函式可以獲得物件的當前引用計數。多數情況下,引用計數比你猜測的要大的多,對於不可變資料(如數字和字串),直譯器會在程式的不同部分共享記憶體,以便節約記憶體。
垃圾回收機制
python中的垃圾回收是以引用計數為主,標記-清除和分代收集為輔。
- 引用計數:Python在記憶體中儲存每個物件的引用計數,如果計數變成0,該物件就會消失,分配給該物件的記憶體就會釋放出來。
- 標記-清除:一些容器物件,比如說list、dict、tuple、instance等可能會出現引用迴圈,對於這些迴圈,垃圾回收器會定時回收這些迴圈(物件之間通過引用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的節點,而引用關係構成這個有向圖的邊)。
- 分代收集:Python把記憶體根據物件存活時間劃分為三代,物件建立之後,垃圾回收器會分配它們所屬的代。每個物件都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的物件越容易被回收。
記憶體池機制
python提供了對記憶體的垃圾收集機制,將不用的的記憶體放到記憶體池
- Pymalloc機制,為了加速Python的執行效率,Python引入了一個Pymalloc機制,用於管理對小塊記憶體(小於256個位元組的物件)的申請和釋放。
- malloc機制,Python中小於256個位元組的物件都使用Pymalloc實現的分配器,而大的物件則使用系統的malloc.
- 私有記憶體池,對於Python物件,如整數,浮點數和list,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。