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

您的位置:首頁技術文章
文章詳情頁

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

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

一 引入

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

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

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

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

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

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

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

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

4.1、什么是引用計數?

引用計數就是:變量值被變量名關聯的次數

如:age=18

變量值18被關聯了一個變量名age,稱之為引用計數為1

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

引用計數增加:

age=18 (此時,變量值18的引用計數為1)m=age (把age的內存地址給了m,此時,m,age都關聯了18,所以變量值18的引用計數為2)

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

引用計數減少:

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

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

值18的引用計數一旦變為0,其占用的內存地址就應該被解釋器的垃圾回收機制回收

4.2、引用計數擴展閱讀

變量值被關聯次數的增加或減少,都會引發引用計數機制的執行(增加或減少值的引用計數),這存在明顯的效率問題。

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

# 如下我們定義了兩個列表,簡稱列表1與列表2,變量名l1指向列表1,變量名l2指向列表2>>> l1=[’xxx’] # 列表1被引用一次,列表1的引用計數變為1>>> l2=[’yyy’] # 列表2被引用一次,列表2的引用計數變為1>>> l1.append(l2) # 把列表2追加到l1中作為第二個元素,列表2的引用計數變為2>>> l2.append(l1) # 把列表1追加到l2中作為第二個元素,列表1的引用計數變為2# l1與l2之間有相互引用# l1 = [’xxx’的內存地址,列表2的內存地址]# l2 = [’yyy’的內存地址,列表1的內存地址]>>> l1[’xxx’, [’yyy’, [...]]]>>> l2[’yyy’, [’xxx’, [...]]]>>> l1[1][1][

循環引用會導致:值不再被任何名字關聯,但是值的引用計數并不會為0,應該被回收但不能被回收,什么意思呢?試想一下,請看如下操作

>>> del l1 # 列表1的引用計數減1,列表1的引用計數變為1>>> del l2 # 列表2的引用計數減1,列表2的引用計數變為1

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

4.2.1 標記-清除

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

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

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

當我們執行x=y時,內存中的棧區與堆區變化如下

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

標記/清除算法的做法是當應用程序可用的內存空間被耗盡的時,就會停止整個程序,然后進行兩項工作,第一項則是標記,第二項則是清除

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

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

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

當我們同時刪除l1與l2時,會清理到棧區中l1與l2的內容

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

這樣在啟用標記清除算法時,發現棧區內不再有l1與l2(只剩下堆區內二者的相互引用),于是列表1與列表2都沒有被標記為存活,二者會被清理掉,這樣就解決了循環引用帶來的內存泄漏問題

4.2.2 分代回收

背景:

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

分代:

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

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

回收:

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀va亚洲va欧美va天堂| 亚洲精品欧美| 国产精品亲子伦av一区二区三区| 樱桃成人精品视频在线播放| 欧美一区三区| 99久久99久久精品国产片果冰| 一区二区精品伦理...| 成人国产综合| 韩国久久久久久| 成人在线丰满少妇av| 国产精品99视频| 国产在线一区不卡| 久久久久久婷| 亚洲高清毛片| 久久久男人天堂| 日韩中文字幕一区二区三区| 久久久久久久久丰满| 亚洲欧美久久精品| 精品日本视频| 中文日韩欧美| 久久av中文| 在线国产一区| 国产伦精品一区二区三区千人斩 | 免费看av不卡| 一区二区三区网站| 国产精品多人| 亚洲午夜久久久久久尤物| 日本视频在线一区| 日韩伦理一区| 日韩一区二区三区高清在线观看| 精品女同一区二区三区在线观看| 免费久久精品| 欧美激情久久久久久久久久久| 九九综合九九| 国产欧美一区二区色老头| 欧美一区二区性| 国产精品qvod| 日本欧美在线看| 麻豆网站免费在线观看| 日韩精品a在线观看91| 色综合狠狠操| 成人在线视频中文字幕| 日韩在线观看一区二区三区| 99视频精品全部免费在线视频| 久久国产尿小便嘘嘘| 国产精品日本欧美一区二区三区| 久久精品一本| 深夜日韩欧美| 亚洲国内欧美| 美女久久久久久| 一级欧美视频| 欧美69视频| 91中文字幕精品永久在线| 日韩高清一区二区| 午夜免费一区| 精品免费av一区二区三区| 日韩精品一二区| 免费黄色成人| 色婷婷色综合| 欧美aa在线视频| 日韩av影院| 免费精品视频| 999国产精品视频| 精品视频一区二区三区四区五区 | 日韩中文影院| 精品国产中文字幕第一页| 日韩欧美在线精品| 亚洲综合另类| 日韩国产一区| 久久久精品区| 国产日韩欧美一区| 蜜桃视频在线观看一区二区| 蜜臀av免费一区二区三区| 国产精品久久久久av电视剧| 国语精品一区| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲精品一二三**| 国产亚洲在线| 亚洲午夜视频| 99精品美女| 黑森林国产精品av| 国产91在线播放精品| 美腿丝袜在线亚洲一区| 91精品一区| 日韩 欧美一区二区三区| 亚洲欧美日韩国产一区| 黄色免费成人| 欧美+日本+国产+在线a∨观看| 久久久成人网| 日韩在线观看| 日韩久久精品网| 日韩久久视频| 日本少妇一区| 久久久久亚洲| 亚洲高清成人| 一区在线视频观看| 午夜一区在线| 亚洲一区日韩| 国产精品日韩欧美一区| 奶水喷射视频一区| 丝袜亚洲精品中文字幕一区| 美女黄网久久| 日韩在线播放一区二区| 久久亚洲电影| 日韩中文av| 日韩一二三区在线观看| 91欧美极品| 免费看一区二区三区| 国产一区国产二区国产三区 | 亚洲永久字幕| 麻豆亚洲精品| 日本一区二区三区视频在线看| 亚洲精品欧洲| 国产日本久久| 国产一区二区三区久久| 久久久噜噜噜| 欧美中文字幕| 日本特黄久久久高潮| 国产精品丝袜在线播放| 国产成人久久精品麻豆二区| 日韩中文字幕高清在线观看| 激情欧美丁香| 日韩影院免费视频| 国产精品自在| 成人精品视频| 999精品色在线播放| 日韩午夜精品| 日韩三级久久| 精品久久不卡| 欧美亚洲国产精品久久| 亚洲乱码视频| 久久精品女人| 免费视频一区三区| 亚洲理论在线| 老司机精品视频在线播放| 国产精品亚洲一区二区三区在线观看| 欧美日韩国产高清电影| 中文字幕一区二区三区四区久久 | 老司机久久99久久精品播放免费| 日韩av网站在线观看| 国产一区日韩| 国产亚洲在线| 久久av影视| 国户精品久久久久久久久久久不卡 | 久久青青视频| 国产麻豆综合| 91成人精品在线| 首页国产精品| 免费日韩av片| 精品国产午夜肉伦伦影院| 午夜精品亚洲| 国产伦精品一区二区三区视频 | 国产日韩欧美三级| 99成人在线视频| 91九色综合| 久久精品亚洲欧美日韩精品中文字幕| 麻豆9191精品国产| 麻豆视频一区二区| 一本色道久久精品| 国产福利资源一区| 午夜国产欧美理论在线播放| 国产精品亚洲一区二区在线观看| 日韩在线短视频| 91精品一区| av一区二区高清| 久久99精品久久久野外观看| 欧美日韩精品免费观看视频完整 | 久久精品色播| 视频一区二区三区中文字幕| 成人在线黄色| 亚洲一区网站| 国产不卡精品| 天堂va在线高清一区| 久久九九精品| 欧美黑人巨大videos精品| 青青青免费在线视频| 日本精品久久| 91成人精品视频| 精品亚洲免a| 亚洲精品一区二区在线播放∴| 国产理论在线| 911亚洲精品| 日韩一级精品| 亚洲黄色网址| 久久国产乱子精品免费女| 99热精品久久| 精品久久不卡| 国产日韩亚洲| 免费观看在线色综合| 日本韩国欧美超级黄在线观看| 国产精品日本一区二区不卡视频| 丝袜美腿成人在线| 亚洲天堂1区| 欧美国产视频| 亚洲精品在线a| 最新亚洲激情| 欧美黄色网页| 精品精品久久| 国产精品videossex| 中文无码日韩欧|