python的記憶體管理機制

2022-06-24 05:51:08 字數 1507 閱讀 2147

從三個方面來說,一物件的引用計數機制,二垃圾**機制,三記憶體池機制

一、物件的引用計數機制

python內部使用引用計數,來保持追蹤記憶體中的物件,所有物件都有引用計數。

引用計數增加的情況:

1,乙個物件分配乙個新名稱

2,將其放入乙個容器中(如列表、元組或字典)

引用計數減少的情況:

1,使用del語句對物件別名顯示的銷毀

2,引用超出作用域或被重新賦值

sys.getrefcount( )函式可以獲得物件的當前引用計數

多數情況下,引用計數比你猜測得要大得多。對於不可變資料(如數字和字串),直譯器會在程式的不同部分共享記憶體,以便節約記憶體。

二、垃圾**

1,當乙個物件的引用計數歸零時,它將被垃圾收集機制處理掉。

2,當兩個物件a和b相互引用時,del語句可以減少a和b的引用計數,並銷毀用於引用底層物件的名稱。然而由於每個物件都包含乙個對其他物件的應用,因此引用計數不會歸零,物件也不會銷毀。(從而導致記憶體洩露)。為解決這一問題,直譯器會定期執行乙個迴圈檢測器,搜尋不可訪問物件的迴圈並刪除它們。

三、記憶體池機制

python提供了對記憶體的垃圾收集機制,但是它將不用的記憶體放到記憶體池而不是返回給作業系統。

1,pymalloc機制。為了加速python的執行效率,python引入了乙個記憶體池機制,用於管理對小塊記憶體的申請和釋放。

2,python中所有小於256個位元組的物件都使用pymalloc實現的分配器,而大的物件則使用系統的malloc。

3,對於python物件,如整數,浮點數和list,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。

python gc主要使用 引用計數 來跟蹤和**垃圾。在引用計數的基礎上,通過「標記-清除」解決容器物件可能產生的迴圈引用問題。通過分代

以空間換時間的方法提高垃圾**效率

引用計數: 每個物件中都有ob-refcnt來做引用計數。當乙個物件...,ob-refcnt就會增加,當引用的物件刪除,那麼ob-refcnt就會減少當ob-refcnt為零,就會釋放該物件的記憶體空間

標記清除: 解決迴圈引用的問題。先按需分配,等到沒有空閒記憶體的時候,從暫存器和程式棧上的引用出發,遍歷所有物件和引用把所有能訪問的打標記,最後將沒有標記的物件釋放掉

分代技術: 提高效率,提高垃圾**的效率,按照存活時間,分成不同的集合。將記憶體塊按照其存活時間劃分為不同的集合。每個集合就稱為乙個「代」,垃圾**的頻率隨代的存活時間增大而減小。python預設定義分代物件集合,引用數越大,物件的存活時間越長

python也會記憶體洩露,python本身的垃圾**機制無法**重寫了del的迴圈引用的物件.

程式設計師管理好每個python物件的引用,盡量在不需要使用物件的時候,斷開所有引用

盡量少通過迴圈引用組織資料,可以改用weakref做弱引用或者用id之類的控制代碼訪問物件

通過gc模組的介面可以檢查出每次垃圾**有哪些物件不能自動處理,再逐個逐個處理

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.垃圾 垃圾 機制 引用計數 標記清除 分帶 引用計數 引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的...