# 記憶體管理:垃圾回識訓制
# 1. 什么是垃圾?
# 垃圾:當一個變數值被系結的變數名的個數為0時,該變數值無法被訪問到,稱之為垃圾
# 2. 什么是垃圾回識訓制?
# 垃圾回識訓制(簡稱GC)是自動幫助我們管理記憶體,清理垃圾的一種工具(用來回收不可用的變數值所占用的記憶體空間)
# 3. 為什么要用垃圾回識訓制?
# 程式運行程序中會申請大量的記憶體空間,而對于一些無用的記憶體空間如果不及時清理的話會導致記憶體使用殆盡(記憶體溢位),導致程式崩潰,因此
# 4. 理解GC原理需要儲備的知識
# 4.1 堆區與堆疊區
# 在定義變數時,變數名與變數值都是需要存盤的,分別對應記憶體中的兩塊區域:堆區與堆疊區,
# 1、變數名與值記憶體地址的關聯關系存放于堆疊區
# 2、變數值存放于堆區,記憶體管理回收的則是堆區的內容
x = 10
y = 20
'''
堆疊區 堆區 其他區
x->140730216776240——》 10
y->140730216776560——》 20
'''
# 當我們執行x=y時,記憶體中的堆疊區與堆區變化
'''
堆疊區 堆區 其他區
x (X) 140730216776240 (X) 10
x->140730216776560——》 20
y->140730216776560——》 20
'''
# 4.2 直接參考和間接參考
# 直接參考:指從堆疊區出發直接參考到的記憶體地址
# 間接參考:指從堆疊區出發直接參考到堆區后,在通過進一步參考才能到達的記憶體地址
l2 = [20, 30] # 串列本身被變數名l2直接參考,包含的元素被串列間接參考
x = 10 # 值10被變數名x直接參考
l1 = [x, l2] # 串列本身被變數名l1直接參考,包含的元素被串列間接參考
# 5.垃圾回識訓制原理
# 5.1、參考計數:變數值被變數名關聯的次數
# 當一個物件的參考計數被創建或者復制時,物件的參考計數增加1;
# 當一個物件的引起被銷毀時,物件的參考計數減1;
# 當物件的參考計數減少為0時,就意味著物件已經沒有被任何人使用了,可以將其所占用記憶體釋放.
# 優點:
# 簡單、直觀
# 實時性,只要沒有了參考就釋放資源.
# 缺點:
# 維護參考計數需要消耗一定的資源
# 回圈參考時,無法回收.正是因為這個原因,才需要通過標記-清理和分代收集機制來輔助參考計數機制.
x = 10 # 直接參考
print(id(x))
y = x
z = x
l = ['a', 'b', 'c'] # 間接參考
print(id(l[2]))
d = {'x': 213} # 間接參考
print(d['x'])
x = 10
l = ['a', 'b', x] # l=['a'的記憶體地址,'b'的記憶體地址,10的記憶體地址]
x = 123
print(l[2]) # 10
# 5.2、標記清除:用來解決回圈參考帶來的記憶體泄漏問題
# 回圈參考=>導致記憶體泄漏
l1 = [111, ]
l2 = [222, ]
l1.append(l2) # l1=[值111的記憶體地址,l2串列的記憶體地址]
l2.append(l1) # l2=[值222的記憶體地址,l1串列的記憶體地址]
print(id(l1[1]))
print(id(l2))
print(id(l2[1]))
print(id(l1))
print(l2)
print(l1[1])
del l1
del l2
# 5.3、分代回收:用來降低參考計數的掃描頻率,提升垃圾回收的效率
# 將系統中的所有記憶體塊根據其存活時間劃分為不同的擠和,
# 每一個集合就成為一個"代",垃圾收集的頻率隨著"代"的存活時間的增大而減小:
# 也就是說,活得越長的物件,就越不可能時垃圾,就應該減少對他的垃圾收集頻率
# 如何來衡量這個存活時間:通常是利用幾次垃圾收集動作來衡量
# 如果一個物件經過的垃圾收集次數越多,可以得出;該物件存活時間就越長
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/241219.html
標籤:Python
上一篇:01-python介紹
下一篇:05-用戶互動
