Python的記憶體管理機制可以從三個方面來講:
(1)垃圾回收
(2)引用計數
(3)記憶體池機制
Python引入了一個機制:引用計數。
python内部使用引用計數,來保持追蹤記憶體中的對象,Python内部記錄了對象有多少個引用,即引用計數,當對象被建立時就建立了一個引用計數,當對象不再需要時,這個對象的引用計數為0時,它被垃圾回收。
總結一下對象會在一下情況下引用計數加1:
1.對象被建立:x=4
2.另外的别人被建立:y=x
3.被作為參數傳遞給函數:foo(x)
4.作為容器對象的一個元素:a=[1,x,'33']
引用計數減少情況
1.一個本地引用離開了它的作用域。比如上面的foo(x)函數結束時,x指向的對象引用減1。
2.對象的别名被顯式的銷毀:del x ;或者del y
3.對象的一個别名被指派給其他對象:x=789
4.對象從一個視窗對象中移除:myList.remove(x)
5.視窗對象本身被銷毀:del myList,或者視窗對象本身離開了作用域。
垃圾回收
1、當記憶體中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的對象,然後清除其在記憶體的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清掉:當兩個對象互相引用時,他們本身其他的引用已經為0了。
2、垃圾回收機制還有一個循環垃圾回收器, 確定釋放循環引用對象(a引用b, b引用a, 導緻其引用計數永遠不為0)。
在Python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被釋放,由于這些記憶體的申請并不是為了建立對象,是以并沒有對象一級的記憶體池機制。這就意味着Python在運作期間會大量地執行malloc和free的操作,頻繁地在使用者态和核心态之間進行切換,這将嚴重影響Python的執行效率。為了加速Python的執行效率,Python引入了一個記憶體池機制,用于管理對小塊記憶體的申請和釋放。
記憶體池機制
Python提供了對記憶體的垃圾收集機制,但是它将不用的記憶體放到記憶體池而不是傳回給作業系統。
Python中所有小于256個位元組的對象都使用pymalloc實作的配置設定器,而大的對象則使用系統的 malloc。另外Python對象,如整數,浮點數和List,都有其獨立的私有記憶體池,對象間不共享他們的記憶體池。也就是說如果你配置設定又釋放了大量的整數,用于緩存這些整數的記憶體就不能再配置設定給浮點數。
在Python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被釋放,由于這些記憶體的申請并不是為了建立對象,是以并沒有對象一級的記憶體池機制。這就意味着Python在運作期間會大量地執行malloc和free的操作,頻繁地在使用者态和核心态之間進行切換,這将嚴重影響 Python的執行效率。為了加速Python的執行效率,Python引入了一個記憶體池機制,用于管理對小塊記憶體的申請和釋放。這也就是之前提到的 Pymalloc機制。