Python中的記憶體管理機制

2022-09-17 23:12:36 字數 1752 閱讀 9056

python引用了乙個記憶體池(memory pool)機制,即pymalloc機制,用於管理對小塊記憶體的申請和釋放

python和其他高階語言一樣,會進行自動的記憶體管理。它使用引用計數機制檢測為物件分配的記憶體是否可以被釋放。然後,在python中記憶體永遠不會返還給作業系統,python會持有這些記憶體並在需要時重新使用它們。在很多場景下,這個特性可以減少記憶體申請和釋放所帶來的效能損耗;但對於需要長時間執行的python程序來講,python將會占用大量的記憶體。如果程序使用記憶體的峰值遠大於平均值,這將會造成記憶體的浪費從而影響本程序甚至是系統中其他程序的效能。

python使用pymalloc管理記憶體。在python中,會頻繁的建立和刪除很多小物件,如果這些物件的記憶體申請和釋放都使用malloc()和free(),將會帶來嚴重的效能問題。因此,pymalloc分配一系列256kb記憶體塊,稱之為arena。每個arena分割為4kb大小的記憶體池pool,每個pool在切分為固定大小的block。在記憶體分配時,分配給程序的就是這些blocks。

上圖中展示了乙個usedpool陣列,此陣列按記憶體大小組織,每個大小對應乙個pool鍊錶,每個pool鍊錶中有多個空閒的block。在分配記憶體時,pymalloc先判斷是否存在要申請的大小的pool,如果存在的話,直接從pool中獲取乙個free block返回給應用程式,這個過程非常迅速。如果分配完這個block後此pool變為乙個空pool,則將這個pool從鍊錶中移除。

如果在usedpool中找不到大小匹配的pool,需要在freepool中查詢可用的pool。在找不到的情況下,首先會嘗試在最後乙個arena中是否存在可用的記憶體,如果有的話則分配乙個非freepool使用;如果不存在這樣的arena,將會通過malloc()分配乙個新的arena。在freepool中找到乙個可用的pool後,會將此pool切分為固定大小的pool並加入到userdpool中,並在其中分配乙個free block應用程式。

在應用程式要釋放乙個block時,過程和分配的過程比較相似。首先會根據block找到此block所歸屬的ool,然後將此block加入到pool的free block列表中。如果pool當前是空的,還會將這個pool加入到usedpool的鍊錶中。如果在block加入到free block後所有的block都是free的,會將此pool從usedpool移動到freepool中

上面的過程可以看到,記憶體釋放的過程基本就是記憶體申請的反過程,但唯一的區別是缺少了將freepool反換費arena,並將arena通過free()返還給作業系統的步驟。

python中有一小部分的物件是不使用pymalloc程序記憶體分配的,主要是integer/float/list/dict。為了提公升這些常用物件的記憶體使用效率,這些物件是儲存在單獨的列表中的。

python通過malloc()為integer/floal兩種型別分配大約1kb大小的記憶體塊列表,這些列表被當做integer/float的陣列使用,而不是使用pymalloc的分配的8位元組的整數倍大小的block,以減少記憶體消耗。在建立乙個新的integer/float物件時,字直接從這個記憶體列表中獲取資料,或是重新分配一塊新的block;在釋放時對應的block重新加入到列表中。這些block也是不會被返還給作業系統的。

python為list/dict採用不同的策略,會最多保留80個空閒的list/dict,如果多餘80個,多出的會被釋放

Python記憶體管理機制

一 python記憶體 因為要呼叫while迴圈,迴圈內有temp變數,不清楚python是否會在每一輪迴圈結束後自動釋放temp記憶體空間,做了乙個記憶體測試,發現無論temp none,還是del temp,只能銷毀變數,無法完全釋放記憶體空間。注 紅色部分標出相同記憶體id。python vi...

python記憶體管理機制

a 1整數1為乙個物件。而a是乙個引用。利用賦值語句,引用a指向物件1。在python中,整數和短小的字元,python都會快取這些物件,以便重複使用。當我們建立多個等於1的引用時,實際上是讓所有這些引用指向同乙個物件。a 1 b 1 print id a print id b 在python中,每...

python記憶體管理機制

1.引用計數 當乙個python物件被引用時 其引用計數增加 1 當其不再被變數引用時 引用計數減 1 當物件引用計數等於 0 時,物件被刪除 引用計數是一種非常高效的記憶體管理機制 2.垃圾 垃圾 機制 引用計數 標記清除 分帶 引用計數 引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的...