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是如何進行記憶體管理的的詳細內容。更多資訊請關注PHP中文網其他相關文章!