python語言開發(fā)垃圾回收機制原理教程
一.什么是垃圾回收機制
垃圾回收機制(簡稱GC), 解釋器自帶的一種機制
它是一種動態(tài)存儲管理技術(shù),自動釋放不再被程序引用的對象所占用的內(nèi)存空間
二.為什么要有垃圾回收機制
程序的運行過程中會申請大量的內(nèi)存空間
對于一些無用的空間如果不及時清理的話會導致內(nèi)存溢出(不夠用),程序就會崩潰
管理內(nèi)存是非常復雜的事情,垃圾回收機制就把程序員從復雜的內(nèi)存管理中解放出啦
三.垃圾回收機制的原理
1.引用計數(shù)
引用計數(shù)就是變量名與變量值的關(guān)聯(lián)次數(shù), 以此來跟蹤和回收垃圾
直接引用
通過變量名直接引用
x = 18 #18被引用了一次,計數(shù)為1 y = x#18被引用加1次,計數(shù)為2 z = y#18被引用加1次,計數(shù)為3 print(id(x)) #140725488808736 print(id(y)) #140725488808736 print(id(z)) #140725488808736
間接引用
容器對其的引用都是間接
x = 18 #18被引用一次,計數(shù)為1 li = [1,2,x] #通過列表引用,計數(shù)加1,為2 dic = {'age': x} #通過字典引用, 計數(shù)加1,為3 print(id(x)) #140725486514976 print(id(li[2])) #140725486514976 列表引用,計數(shù)4 print(id(dic['age'])) #140725486514976 字典引用,計數(shù)5
2.棧區(qū) / 堆區(qū)
棧區(qū) : 存放的是變量名與變量值的內(nèi)存地址映射關(guān)系
堆區(qū) : 存放的是值真正的位置
3.總結(jié)
直接引用指的是從棧區(qū)出發(fā)直接引用到的內(nèi)存地址
間接引用指的是從棧區(qū)出發(fā)引用到堆區(qū)后,再通過進一步引用才能到達的內(nèi)存地址
四.標記清除
1.循環(huán)引用問題(也叫交叉引用)
#我們先定義列表 l1=[0] # 列表1被引用一次,列表1的引用計數(shù)變?yōu)? l2=[1] # 列表2被引用一次,列表2的引用計數(shù)變?yōu)? #將列表加入另一個列表 l1.append(l2) # 把列表2追加到l1中作為第二個元素,列表2的引用計數(shù)變?yōu)? l2.append(l1) # 把列表1追加到l2中作為第二個元素,列表1的引用計數(shù)變?yōu)? #解除比變量名"l1"和"l2"與值的對應關(guān)系 del l1 del l2
2.循環(huán)引用導致的結(jié)果
值不再被任何名字關(guān)聯(lián),但是值的引用計數(shù)并不會為0
應該被回收但又不能被回收
3.解決方法 : 清除-標記
容器對象的的引用都有可能產(chǎn)生循環(huán)引用, 而清除-標記就是為解決這個問題的
當應用程序可用空間被耗盡時, 清除-標記會停止整個程序, 然后先標記, 再清除
- 標記
但凡是可以從棧區(qū)出發(fā),找到對應堆區(qū)內(nèi)容的(直接或間接引用)就標記存活,非存活則清除
具體點:標記的過程其實就是,遍歷所有的"GC Roots"對象(棧區(qū)中的所有內(nèi)容或者線程都可以作為"GC Roots"對象)
然后將所有"GC Roots"的對象可以直接或間接訪問到的對象標記為存活的對象,其余的均為非存活對象,應該被清除 - 清除
遍歷堆中的對象,將沒有標記存活的對象都清理掉
五.分代回收
1.效率問題
基于引用計數(shù)的回收機制,每次回收內(nèi)存,都需要把所有對象的引用計數(shù)都遍歷一遍
這是非常消耗時間的,于是引入了分代回收來提高回收效率
分代回收采用的是用**“空間換時間”**的策略。
2.解決方法 : 分代回收
分代
分代指的是根據(jù)變量的存活時間來劃分他們的等級
一個變量經(jīng)常被引用,等級(權(quán)重)就會提高,權(quán)重達到設(shè)定值就會進入下一個等級
當經(jīng)過多次掃描都沒有被回收,"GC機制"就會認為該變量是常量
于是對其的掃描頻率會降低
回收
當計數(shù)降低,就容易被回收
分代回收可以起到提升效率的效果,但也存在一定的缺點:
比如一個變量剛從低等級轉(zhuǎn)入高等級,它就被解除了綁定關(guān)系
它應該被回收,但高等級掃描頻率低于低等級
那么這個已被解除綁定關(guān)系的變量無法及時得到清理
總結(jié)
垃圾回收機制是在清理垃圾和釋放內(nèi)存的前提下
允許一些垃圾不被釋放為代價(就是等級權(quán)重高點的垃圾不會及時被清理)
以此換取引用計數(shù)掃描頻率的降低,從而提升其性能
這是一種以空間換時間的解決方案
以上就是python語言開發(fā)垃圾回收機制原理教程的詳細內(nèi)容,更多關(guān)于python語垃圾回收機制原理的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。