91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python語言開發垃圾回收機制原理的示例分析

發布時間:2022-03-04 14:16:28 來源:億速云 閱讀:139 作者:小新 欄目:開發技術

這篇文章主要介紹python語言開發垃圾回收機制原理的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一.什么是垃圾回收機制

垃圾回收機制(簡稱GC), 解釋器自帶的一種機制

它是一種動態存儲管理技術,自動釋放不再被程序引用的對象所占用的內存空間

二.為什么要有垃圾回收機制

程序的運行過程中會申請大量的內存空間

對于一些無用的空間如果不及時清理的話會導致內存溢出(不夠用),程序就會崩潰

管理內存是非常復雜的事情,垃圾回收機制就把程序員從復雜的內存管理中解放出啦

三.垃圾回收機制的原理

1.引用計數

引用計數就是變量名與變量值的關聯次數, 以此來跟蹤和回收垃圾

直接引用

通過變量名直接引用

x = 18  #18被引用了一次,計數為1
y = x   #18被引用加1次,計數為2
z = y   #18被引用加1次,計數為3
print(id(x))  #140725488808736
print(id(y))  #140725488808736
print(id(z))  #140725488808736
間接引用

容器對其的引用都是間接

x = 18                 #18被引用一次,計數為1
li = [1,2,x]           #通過列表引用,計數加1,為2
dic = {'age': x}       #通過字典引用, 計數加1,為3
print(id(x))           #140725486514976
print(id(li[2]))       #140725486514976 列表引用,計數4
print(id(dic['age']))  #140725486514976 字典引用,計數5

2.棧區 / 堆區

棧區 : 存放的是變量名與變量值的內存地址映射關系

堆區 : 存放的是值真正的位置

python語言開發垃圾回收機制原理的示例分析

3.總結

直接引用指的是從棧區出發直接引用到的內存地址

間接引用指的是從棧區出發引用到堆區后,再通過進一步引用才能到達的內存地址

四.標記清除

1.循環引用問題(也叫交叉引用)

#我們先定義列表
l1=[0]  # 列表1被引用一次,列表1的引用計數變為1   
l2=[1]  # 列表2被引用一次,列表2的引用計數變為1   

#將列表加入另一個列表
l1.append(l2)  # 把列表2追加到l1中作為第二個元素,列表2的引用計數變為2
l2.append(l1)  # 把列表1追加到l2中作為第二個元素,列表1的引用計數變為2

#解除比變量名"l1"和"l2"與值的對應關系
del l1
del l2

2.循環引用導致的結果

值不再被任何名字關聯,但是值的引用計數并不會為0

應該被回收但又不能被回收

3.解決方法 : 清除-標記

容器對象的的引用都有可能產生循環引用, 而清除-標記就是為解決這個問題的

當應用程序可用空間被耗盡時, 清除-標記會停止整個程序, 然后先標記, 再清除

  • 標記
    但凡是可以從棧區出發,找到對應堆區內容的(直接或間接引用)就標記存活,非存活則清除
    具體點:標記的過程其實就是,遍歷所有的"GC Roots"對象(棧區中的所有內容或者線程都可以作為"GC Roots"對象)
    然后將所有"GC Roots"的對象可以直接或間接訪問到的對象標記為存活的對象,其余的均為非存活對象,應該被清除

  • 清除
    遍歷堆中的對象,將沒有標記存活的對象都清理掉

五.分代回收

1.效率問題

基于引用計數的回收機制,每次回收內存,都需要把所有對象的引用計數都遍歷一遍

這是非常消耗時間的,于是引入了分代回收來提高回收效率

分代回收采用的是用**“空間換時間”**的策略。

2.解決方法 : 分代回收

分代

分代指的是根據變量的存活時間來劃分他們的等級
一個變量經常被引用,等級(權重)就會提高,權重達到設定值就會進入下一個等級
當經過多次掃描都沒有被回收,"GC機制"就會認為該變量是常量
于是對其的掃描頻率會降低

python語言開發垃圾回收機制原理的示例分析

回收

當計數降低,就容易被回收
分代回收可以起到提升效率的效果,但也存在一定的缺點:
       比如一個變量剛從低等級轉入高等級,它就被解除了綁定關系
       它應該被回收,但高等級掃描頻率低于低等級
       那么這個已被解除綁定關系的變量無法及時得到清理

以上是“python語言開發垃圾回收機制原理的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝鸡市| 余姚市| 手游| 长阳| 临澧县| 铅山县| 乐至县| 舟山市| 夹江县| 迭部县| 分宜县| 丘北县| 黄骅市| 金山区| 南江县| 宜川县| 阿克苏市| 阿拉善右旗| 横峰县| 大足县| 湾仔区| 杨浦区| 邢台县| 莆田市| 治县。| 南郑县| 南漳县| 黎平县| 乌拉特前旗| 鲁甸县| 蒙城县| 康乐县| 鄄城县| 景东| 蛟河市| 宾川县| 吴桥县| 吉安市| 贵定县| 北碚区| 定南县|