垃圾回識訓制
什么是垃圾回識訓制
垃圾回識訓制是專門回收沒有被變數名系結的垃圾資料 用來釋放空間
參考計數
參考計數就是資料值與變數名之間系結的次數
age = 18 #資料值18的參考計數為1
參考計數增加:
x = age #資料值18的參考計數為2
'把age的記憶體地址給了x,此時age和x都系結了18 所以18的參考計數為2'
參考計數減少:
age = 20 #資料值18的參考計數變成1
'變數名age與資料值18解除系結,再與20系結,所以資料值18的參考計數從2變成了1'
del x #資料值18的參考計數變成0
'解除變數名m的系結關系,所以資料值18沒有變數名系結,參考計數就從1變成了0'qw

參考計數:當資料值身上的參考計數為0時 就會被當成垃圾回識訓制回收 不為0則不會回收
缺陷:參考計數可能會造成回圈參考問題
標記清除
標記清除主要是解決回圈參考的問題
? 哪些情況會使參考計數增加:
被變數名系結時
? 被串列索引和字典k索引時
? 什么情況下 參考計數會減少
變數名與資料值解除系結時
? 索引的串列或字典被回收時
參考計數來解決垃圾問題是有隱患的 >> 回圈問題
# 看以下一段程式
l1 = ['a'] # 兩變數分別系結了一個串列
l2 = ['b'] # 兩個不同的串列分別參考計數為1
l1.append(l2) # l1 = ['a', l2] 串列2的參考計數加為2
l2.append(l1) # l2 = ['b', l1] 串列1的參考計數加為2
del l1 # l1變數斷開,串列1參考計數-1
del l2 # l2變數斷開,串列2參考計數-1

我們可以發現 最終記憶體中的資料值已經沒有變數系結了 找不到了 符合垃圾的定義 但是身上還有計數 沒有被回收
所以就產生了可一個機制 :
? 當記憶體占用達到臨界點時 程式就會停止運行 掃描程式中的所有資料值 把產生回圈的資料打上標記 最最后統一清除掉 >> 標記清除
分代回收
分代回收一般分為三代:
新生代 青春代 老年代
資料值身上的計數越多 越不容易被清除 所以越容易放在下面
越往下 掃描間隔的時間越長 越在上面掃間隔的時間越短

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542127.html
標籤:其他
上一篇:常見限流演算法
