python記憶體管理

2022-05-17 02:08:44 字數 1081 閱讀 8052

cpython的記憶體管理機制:垃圾**機制

疑問:什麼是垃圾**機制?

垃圾**機制是python系統採用的記憶體優化機制,採用的是引用計數,每隔一段時間python直譯器會去檢視變數的被引用次數,如果發現引用次數為0,系統就會預設他是垃圾,將他清除,如果不是0,就會認為他是有效的資料,從而不會刪除,那麼引用計數是怎麼實現的呢?就是檢視這個變數的被引用個數,如果發現他被引用一次,就為1,如果發現被引用次數又加了一次,那麼就是2,依次類推,但是這個機制有乙個致命的缺點,他無法解決迴圈匯入的問題,比如說在乙個容器型別的元素中匯入了另乙個容器型別的元素,此時在將他們的變數刪除,這個變數已經訪問不到了,但是由於他們之間還存在相互引用,就會導致直譯器掃瞄的時候發現引用計數不為0,不將它清除,就會造成記憶體的洩露,為了解決這個問題,引入了標記清除和分代**。標記清除就是標記變數的存活狀態,滿了以後就將這些存活者的所有值一次性的複製到另外一塊新空間,將老空間的東西全部刪除,解決了迴圈引入的問題,但是會很耗時間,為了少消耗時間,分代開始上線,是將所有的變數值標記,如果多次掃瞄發現都在,就將他移動到青春代,再次掃瞄還在的話就會將他移動到老年代,注意,越往上掃瞄時間越長,雖然犧牲了記憶體空間,但是時間消耗少。

總結:

本質 ----引用計數

方法---標記清除+分代**

方法出現原因:引用計數不能解決迴圈引用的問題

引用計數圖

迴圈引用舉例

l1=[666]

l2=[888]

print(l1) #

[666, [888, [...]]]

print(l2) #

[888, [666, [...]]]

分代圖

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

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

python 記憶體管理

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

Python記憶體管理

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