日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python語法垃圾回收機制原理解析

瀏覽:153日期:2022-08-01 11:18:22

一 引入

解釋器在執(zhí)行到定義變量的語法時,會申請內(nèi)存空間來存放變量的值,而內(nèi)存的容量是有限的,這就涉及到變量值所占用內(nèi)存空間的回收問題,當(dāng)一個變量值沒有用了(簡稱垃圾)就應(yīng)該將其占用的內(nèi)存給回收掉,那什么樣的變量值是沒有用的呢?由于變量名是訪問到變量值的唯一方式,所以當(dāng)一個變量值不再關(guān)聯(lián)任何變量名時,我們就無法再訪問到該變量值了,該變量值就是沒有用的,就應(yīng)該被當(dāng)成一個垃圾回收。

毫無疑問,內(nèi)存空間的申請與回收是非常耗費精力的事情,而且存在很大的危險性,稍有不慎就有可能引發(fā)內(nèi)存溢出問題,好在Cpython解釋器提供了自動的垃圾回收機制來幫我們 解決了這件事。

二、什么是垃圾回收機制?

垃圾回收機制(簡稱GC)是Python解釋器自帶一種機,專門用來回收不可用的變量值所占用的內(nèi)存空間

三、為什么要用垃圾回收機制?

程序運行過程中會申請大量的內(nèi)存空間,而對于一些無用的內(nèi)存空間如果不及時清理的話會導(dǎo)致內(nèi)存使用殆盡(內(nèi)存溢出),導(dǎo)致程序崩潰,因此管理內(nèi)存是一件重要且繁雜的事情,而python解釋器自帶的垃圾回收機制把程序員從繁雜的內(nèi)存管理中解放出來。

四、垃圾回收機制原理分析

Python的GC模塊主要運用了“引用計數(shù)”(reference counting)來跟蹤和回收垃圾。在引用計數(shù)的基礎(chǔ)上,還可以通過“標(biāo)記-清除”(mark and sweep)解決容對象可能產(chǎn)生的循環(huán)引用的問題,并且通過“分代回收”(generation collection)以空間換取時間的方式來進一步提高垃圾回收的效率。

4.1、什么是引用計數(shù)?

引用計數(shù)就是:變量值被變量名關(guān)聯(lián)的次數(shù)

如:age=18

變量值18被關(guān)聯(lián)了一個變量名age,稱之為引用計數(shù)為1

Python語法垃圾回收機制原理解析

引用計數(shù)增加:

age=18 (此時,變量值18的引用計數(shù)為1)m=age (把age的內(nèi)存地址給了m,此時,m,age都關(guān)聯(lián)了18,所以變量值18的引用計數(shù)為2)

Python語法垃圾回收機制原理解析

引用計數(shù)減少:

age=10(名字age先與值18解除關(guān)聯(lián),再與3建立了關(guān)聯(lián),變量值18的引用計數(shù)為1)del m(del的意思是解除變量名x與變量值18的關(guān)聯(lián)關(guān)系,此時,變量18的引用計數(shù)為0)

Python語法垃圾回收機制原理解析

值18的引用計數(shù)一旦變?yōu)?,其占用的內(nèi)存地址就應(yīng)該被解釋器的垃圾回收機制回收

4.2、引用計數(shù)擴展閱讀

變量值被關(guān)聯(lián)次數(shù)的增加或減少,都會引發(fā)引用計數(shù)機制的執(zhí)行(增加或減少值的引用計數(shù)),這存在明顯的效率問題。

如果說執(zhí)行效率還僅僅是引用計數(shù)機制的一個軟肋的話,那么很不幸,引用計數(shù)機制還存在著一個致命的弱點,即循環(huán)引用(也稱交叉引用)

# 如下我們定義了兩個列表,簡稱列表1與列表2,變量名l1指向列表1,變量名l2指向列表2>>> l1=[’xxx’] # 列表1被引用一次,列表1的引用計數(shù)變?yōu)?>>> l2=[’yyy’] # 列表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之間有相互引用# l1 = [’xxx’的內(nèi)存地址,列表2的內(nèi)存地址]# l2 = [’yyy’的內(nèi)存地址,列表1的內(nèi)存地址]>>> l1[’xxx’, [’yyy’, [...]]]>>> l2[’yyy’, [’xxx’, [...]]]>>> l1[1][1][

循環(huán)引用會導(dǎo)致:值不再被任何名字關(guān)聯(lián),但是值的引用計數(shù)并不會為0,應(yīng)該被回收但不能被回收,什么意思呢?試想一下,請看如下操作

>>> del l1 # 列表1的引用計數(shù)減1,列表1的引用計數(shù)變?yōu)?>>> del l2 # 列表2的引用計數(shù)減1,列表2的引用計數(shù)變?yōu)?

此時,只剩下列表1與列表2之間的相互引用,兩個列表的引用計數(shù)均不為0,但兩個列表不再被任何其他對象關(guān)聯(lián),沒有任何人可以再引用到它們,所以它倆占用內(nèi)存空間應(yīng)該被回收,但由于相互引用的存在,每一個對象的引用計數(shù)都不為0,因此這些對象所占用的內(nèi)存永遠(yuǎn)不會被釋放,所以循環(huán)引用是致命的,這與手動進行內(nèi)存管理所產(chǎn)生的內(nèi)存泄露毫無區(qū)別。所以Python引入了“標(biāo)記-清除” 與“分代回收”來分別解決引用計數(shù)的循環(huán)引用與效率低的問題

4.2.1 標(biāo)記-清除

容器對象(比如:list,set,dict,class,instance)都可以包含對其他對象的引用,所以都可能產(chǎn)生循環(huán)引用。而“標(biāo)記-清除”計數(shù)就是為了解決循環(huán)引用的問題。

在了解標(biāo)記清除算法前,我們需要明確一點,關(guān)于變量的存儲,內(nèi)存中有兩塊區(qū)域:堆區(qū)與棧區(qū),在定義變量時,變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系存放于棧區(qū),變量值存放于堆區(qū),內(nèi)存管理回收的則是堆區(qū)的內(nèi)容,詳解如下圖,定義了兩個變量x = 10、y = 20

Python語法垃圾回收機制原理解析

當(dāng)我們執(zhí)行x=y時,內(nèi)存中的棧區(qū)與堆區(qū)變化如下

Python語法垃圾回收機制原理解析

標(biāo)記/清除算法的做法是當(dāng)應(yīng)用程序可用的內(nèi)存空間被耗盡的時,就會停止整個程序,然后進行兩項工作,第一項則是標(biāo)記,第二項則是清除

#1、標(biāo)記標(biāo)記的過程其實就是,遍歷所有的GC Roots對象(棧區(qū)中的所有內(nèi)容或者線程都可以作為GC Roots對象),然后將所有GC Roots的對象可以直接或間接訪問到的對象標(biāo)記為存活的對象,其余的均為非存活對象,應(yīng)該被清除。#2、清除清除的過程將遍歷堆中所有的對象,將沒有標(biāo)記的對象全部清除掉。

直接引用指的是從棧區(qū)出發(fā)直接引用到的內(nèi)存地址,間接引用指的是從棧區(qū)出發(fā)引用到堆區(qū)后再進一步引用到的內(nèi)存地址,以我們之前的兩個列表l1與l2為例畫出如下圖像

Python語法垃圾回收機制原理解析

當(dāng)我們同時刪除l1與l2時,會清理到棧區(qū)中l(wèi)1與l2的內(nèi)容

Python語法垃圾回收機制原理解析

這樣在啟用標(biāo)記清除算法時,發(fā)現(xiàn)棧區(qū)內(nèi)不再有l(wèi)1與l2(只剩下堆區(qū)內(nèi)二者的相互引用),于是列表1與列表2都沒有被標(biāo)記為存活,二者會被清理掉,這樣就解決了循環(huán)引用帶來的內(nèi)存泄漏問題

4.2.2 分代回收

背景:

基于引用計數(shù)的回收機制,每次回收內(nèi)存,都需要把所有對象的引用計數(shù)都遍歷一遍,這是非常消耗時間的,于是引入了分代回收來提高回收效率,分代回收采用的是用“空間換時間”的策略。

分代:

分代回收的核心思想是:在歷經(jīng)多次掃描的情況下,都沒有被回收的變量,gc機制就會認(rèn)為,該變量是常用變量,gc對其掃描的頻率會降低,具體實現(xiàn)原理如下:

分代指的是根據(jù)存活時間來為變量劃分不同等級(也就是不同的代)新定義的變量,放到新生代這個等級中,假設(shè)每隔1分鐘掃描新生代一次,如果發(fā)現(xiàn)變量依然被引用,那么該對象的權(quán)重(權(quán)重本質(zhì)就是個整數(shù))加一,當(dāng)變量的權(quán)重大于某個設(shè)定得值(假設(shè)為3),會將它移動到更高一級的青春代,青春代的gc掃描的頻率低于新生代(掃描時間間隔更長),假設(shè)5分鐘掃描青春代一次,這樣每次gc需要掃描的變量的總個數(shù)就變少了,節(jié)省了掃描的總時間,接下來,青春代中的對象,也會以同樣的方式被移動到老年代中。也就是等級(代)越高,被垃圾回收機制掃描的頻率越低

回收:

回收依然是使用引用計數(shù)作為回收的依據(jù)Python語法垃圾回收機制原理解析

雖然分代回收可以起到提升效率的效果,但也存在一定的缺點:

例如一個變量剛剛從新生代移入青春代,該變量的綁定關(guān)系就解除了,該變量應(yīng)該被回收,但青春代的掃描頻率低于新生代,所以該變量的回收就會被延遲。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
韩国女主播一区二区三区| 国产福利片在线观看| 新版的欧美在线视频| 欧美激情 亚洲a∨综合| 日韩国产欧美在线视频| 日韩精品导航| 欧美一区激情| 国产福利一区二区精品秒拍| 麻豆久久久久久久| 精品91福利视频| 欧美成人一二区| 国产精品久久久亚洲一区| 国产午夜一区| 国产精品99一区二区三| 亚洲欧洲高清| 国精品一区二区三区| 黄色网一区二区| 久久久久免费| 亚洲综合专区| 91成人精品| 欧美一区自拍| 日韩高清中文字幕一区二区| 亚洲精品888| 免费观看在线综合| 久久精品毛片| 99视频精品全部免费在线视频| 欧美精选视频一区二区| 日本大胆欧美人术艺术动态| 免费在线成人| 免费久久精品| 青青草视频一区| 欧美久久精品一级c片| 亚洲精品乱码日韩| 日韩激情一二三区| 国产精品videossex久久发布| 精品国产鲁一鲁****| 色网在线免费观看| 国产精品毛片在线| 蜜桃av一区| 日韩黄色在线观看| 欧美一区二区三区高清视频| 国产精品激情| 免费精品视频在线| 亚洲自啪免费| 国产 日韩 欧美 综合 一区| 日韩影院精彩在线| 精品九九久久| 欧美男人天堂| 视频一区欧美精品| 美女性感视频久久| 在线看片不卡| 久久国产视频网| 欧美精品资源| 日韩久久99| 福利在线免费视频| 欧美日韩国产高清| 日本国产亚洲| 精精国产xxxx视频在线播放| 一区二区三区国产在线| а√天堂8资源在线| 综合国产精品| 亚洲涩涩在线| 日韩欧美高清一区二区三区| 日本不良网站在线观看| 亚洲午夜久久| 久久91导航| 久久国内精品自在自线400部| 999国产精品永久免费视频app| 午夜电影一区| 91精品推荐| 婷婷亚洲精品| 亚洲精品国产嫩草在线观看 | 精精国产xxxx视频在线播放| 亚洲一区二区三区无吗| 97精品国产一区二区三区| 在线一区视频| 色婷婷色综合| 日韩1区2区3区| 99精品视频精品精品视频| 国产精品一页| 免费观看日韩电影| 99精品网站| 日韩国产一区二| 国产96在线亚洲| 国产婷婷精品| 国产精品蜜芽在线观看| 日韩欧美综合| 亚洲v天堂v手机在线| 伊伊综合在线| 日本欧洲一区二区| 日韩一区亚洲二区| 麻豆精品国产91久久久久久| 亚洲综合在线电影| 欧美日韩亚洲三区| 亚洲国内精品| 天堂√8在线中文| 久久久久久亚洲精品美女| 好吊日精品视频 | 男女男精品网站| 97精品国产一区二区三区| 国产高清不卡| 亚洲精品国产日韩| 深夜视频一区二区| 欧美午夜不卡| 你懂的亚洲视频| 黑丝一区二区| 国产精品丝袜在线播放| 亚洲在线久久| 在线观看免费一区二区| 视频在线观看一区| 亚洲精品中文字幕乱码| 不卡一二三区| 国产乱码精品| 影音先锋久久精品| 欧美在线不卡| 在线看片日韩| 在线亚洲精品| 欧美日韩亚洲一区二区三区在线| 欧美午夜不卡| 国产91在线播放精品| 久久免费黄色| 在线精品亚洲欧美日韩国产| 日本欧美国产| 日韩a一区二区| 91亚洲人成网污www| 福利在线一区| 日韩大片在线播放| 精品中国亚洲| 国产一区三区在线播放| 高清一区二区三区| а√在线中文在线新版| 日韩精品诱惑一区?区三区| av资源中文在线| 91看片一区| 国产综合视频| 黄色亚洲精品| 中文字幕av亚洲精品一部二部| 亚州欧美在线| 国产亚洲久久| 鲁大师精品99久久久| 国产成人精品一区二区三区免费| 国产一区精品福利| 国产在线视频欧美一区| 蜜桃av.网站在线观看| 99久久久久国产精品| 亚洲激情久久| 亚洲乱码一区| 国产精品一区三区在线观看| 久久精品理论片| 久久久久午夜电影| aⅴ色国产欧美| 日本不卡视频一二三区| 欧美成人精品一级| 中文字幕系列一区| 亚洲在线电影| 欧美亚洲三级| 国产精品精品| 亚洲夜间福利| 日本在线视频一区二区| av亚洲在线观看| 成人污污视频| 日韩1区2区日韩1区2区| 日韩午夜电影| 桃色av一区二区| 国产亚洲一卡2卡3卡4卡新区| 99精品美女| 日韩欧美一区二区三区免费观看| 日韩一区精品视频| 国产精品99一区二区| 精品亚洲a∨| 亚洲精品日韩久久| 亚洲91精品| 久久午夜影院| 亚洲乱码一区| 老司机精品视频在线播放| 99精品网站| 加勒比视频一区| 91精品福利| 美女久久一区| 91欧美国产| 日韩不卡免费高清视频| 一区二区三区四区在线观看国产日韩| 日本亚州欧洲精品不卡| 国产精品tv| 欧美亚洲激情| 亚洲精品美女91| 精品亚洲自拍| 日韩国产专区| 一区二区国产精品| 国产在线视频欧美一区| 欧美特黄视频| 国产99精品| bbw在线视频| 成人三级高清视频在线看| 国产精品成人a在线观看| 精品国产一区二区三区性色av| 日本亚洲最大的色成网站www | 亚洲精品一区二区妖精| 国产成人精品一区二区三区视频| 成人小电影网站|