python 記憶體管理

2021-06-16 23:23:19 字數 1410 閱讀 6278

記憶體管理,對於python這樣的動態語言,是至關重要的一部分,它在很大程度上甚至決定了python的執行效率,因為在python的執行中,會建立和銷毀大量的物件,這些都涉及到記憶體的管理。

小塊空間的記憶體池

在python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被釋放,由於這些記憶體的申請並不是為了建立物件,所以並沒有物件一級的記憶體池機制。

python記憶體池全景

這就意味著python在執行期間會大量地執行malloc和free的操作,頻繁地在使用者態和核心態之間進行切換,這將嚴重影響python的執行效率。為了加速python的執行效率,python引入了乙個記憶體池機制,用於管理對小塊記憶體的申請和釋放。這也就是之前提到的pymalloc機制。

在python 2.5中,python內部預設的小塊記憶體與大塊記憶體的分界點定在256個位元組,這個分界點由前面我們看到的名為small_request_threshold的符號控制。

也就是說,當申請的記憶體小於256位元組時,pyobject_malloc會在記憶體池中申請記憶體;當申請的記憶體大於256位元組時,pyobject_malloc的行為將蛻化為malloc的行為。當然,通過修改python源**,我們可以改變這個預設值,從而改變python的預設記憶體管理行為。

在乙個物件的引用計數減為0時,與該物件對應的析構函式就會被呼叫。

但是要特別注意的是,呼叫析構函式並不意味著最終一定會呼叫free釋放記憶體空間,如果真是這樣的話,那頻繁地申請、釋放記憶體空間會使 python的執行效率大打折扣(更何況python已經多年揹負了人們對其執行效率的不滿)。一般來說,python中大量採用了記憶體物件池的技術,使用這種技術可以避免頻繁地申請和釋放記憶體空間。因此在析構時,通常都是將物件占用的空間歸還到記憶體池中。

"這個問題就是:python的arena從來不釋放pool。這個問題為什麼會引起類似於記憶體洩漏的現象呢。考慮這樣一種情形,申請10*1024*1024個16位元組的小記憶體,這就意味著必須使用160m的記憶體,由於python沒有預設將前面提到的限制記憶體池的with_memory_limits編譯符號開啟,所以python會完全使用arena來滿足你的需求,這都沒有問題,關鍵的問題在於過了一段時間,你將所有這些16位元組的記憶體都釋放了,這些記憶體都回到arena的控制中,似乎沒有問題。

但是問題恰恰就在這時出現了。因為arena始終不會釋放它維護的pool集合,所以這160m的記憶體始終被python占用,如果以後程式執行中再也不需要160m如此巨大的記憶體,這點記憶體豈不是就浪費了?"

python記憶體管理規則:del的時候,把list的元素釋放掉,把管理元素的大物件**到py物件緩衝池裡。

python 記憶體分析 python記憶體管理分析

記憶體管理,對於python這樣的動態語言,是至關重要的一部分,它在很大程度上甚至決定了python的執行效率,因為在python的執行中,會建立和銷毀大量的物件,這些都涉及到記憶體的管理。小塊空間的記憶體池 在python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被...

Python記憶體管理

1.引用和物件 python是動態型別的語言 參考動態型別 物件與引用分離。賦值語句 a 1 中,整數1為乙個物件。而a是乙個引用。利用賦值語句,引用a指向物件1。python的內建函式id 它用於返回物件的身份 identity 其實,這裡所謂的身份,就是該物件的記憶體位址。a 1 print i...

Python記憶體管理

python的記憶體管理是依據物件引用次數管理的,物件被建立,分配記憶體給物件 物件引用計數為0,分配給物件的記憶體被 下面這些情況物件的引用計數 1 物件被建立 a create object 引用被賦值 b a 被作為引數傳遞給函式 f a 作為容器物件的乙個元素 lst 1,a 下面這些情況物...