談?wù)刾ython垃圾回收機(jī)制
什么是垃圾回收機(jī)制?
首先,咱先來(lái)解釋名詞,垃圾回收是不是就是將沒(méi)用的,廢棄的東西回收起來(lái)。
在坐的各位都沒(méi)有女朋友對(duì)吧,那難以想象你們的房間會(huì)是一個(gè)什么樣子,可能會(huì)有很多垃圾,很凌亂,自己也不收拾。那當(dāng)你有了女朋友了就不一樣了,她會(huì)幫你收拾房間,把沒(méi)用的垃圾都給你扔掉。
那在我們Python當(dāng)中的垃圾回收承擔(dān)的就是女朋友的角色,你們想象一下,你現(xiàn)在有一個(gè)輕度強(qiáng)迫癥的女朋友一刻不停的跟在你的背后打掃衛(wèi)生,你一放下臟碟子或者垃圾什么的,就已經(jīng)幫你清理、打掃了
所以垃圾回收機(jī)制就是自動(dòng)幫助我們管理內(nèi)存,清理垃圾的一種工具
垃圾回收機(jī)制有什么用?
那我們現(xiàn)在先來(lái)想一想,我們平時(shí)在寫(xiě)程序的時(shí)候是不是會(huì)定義一些變量名,那這些變量名都是存在哪些地方呢?是不是都是存在內(nèi)存里面,那當(dāng)我們一直不停的定義變量是不是就會(huì)使我們內(nèi)存空間的占有率增加,那我們的垃圾回收機(jī)制就會(huì)將一些沒(méi)用的名字,沒(méi)用的垃圾自動(dòng)的回收起來(lái)。
識(shí)別垃圾對(duì)象,從垃圾對(duì)象那里回收內(nèi)存
怎么進(jìn)行垃圾回收
在我們Python當(dāng)中采用的是引用計(jì)數(shù)機(jī)制為主,分代收集機(jī)制為輔的策略。
1、引用計(jì)數(shù)
在Python中,大多數(shù)對(duì)象的生命周期都是通過(guò)對(duì)象的引用計(jì)數(shù)來(lái)管理的。從廣義上來(lái)講,引用計(jì)數(shù)也是一種垃圾收集機(jī)制,而且也是一種最直觀,最簡(jiǎn)單的垃圾收集技術(shù)。
引用計(jì)數(shù)的原理:
當(dāng)一個(gè)對(duì)象的引用被創(chuàng)建或者復(fù)制時(shí),對(duì)象的引用計(jì)數(shù)加1;
當(dāng)一個(gè)對(duì)象的引用被銷(xiāo)毀時(shí),對(duì)象的引用計(jì)數(shù)減1;
當(dāng)對(duì)象的引用計(jì)數(shù)減少為0時(shí),就意味著對(duì)象已經(jīng)沒(méi)有被任何人使用了,可以將其所占用的內(nèi)存釋放了。
引用計(jì)數(shù)有一個(gè)致命的弱點(diǎn)就是是循環(huán)引用(也稱(chēng)交叉應(yīng)用)。
循環(huán)引用可以使一組對(duì)象的引用計(jì)數(shù)不為0,然而這些對(duì)象實(shí)際上并沒(méi)有被任何外部對(duì)象所引用,它們之間只是相互引用。
這意味著不會(huì)再有人使用這組對(duì)象,應(yīng)該回收這組對(duì)象所占用的內(nèi)存空間,然后由于相互引用的存在,
每一個(gè)對(duì)象的引用計(jì)數(shù)都不為0,因此這些對(duì)象所占用的內(nèi)存永遠(yuǎn)不會(huì)被釋放。
優(yōu)點(diǎn):
簡(jiǎn)單、直觀
實(shí)時(shí)性,只要沒(méi)有了引用就釋放資源。
缺點(diǎn):
維護(hù)引用計(jì)數(shù)需要消耗一定的資源
循環(huán)應(yīng)用時(shí),無(wú)法回收。也正是因?yàn)檫@個(gè)原因,才需要通過(guò)標(biāo)記-清理和分代收集機(jī)制來(lái)輔助引用計(jì)數(shù)機(jī)制。
2、標(biāo)記-清除
“標(biāo)記-清除”是為了解決循環(huán)引用的問(wèn)題??梢园渌麑?duì)象引用的容器對(duì)象(比如:list,set,dict,class,instance)都可能產(chǎn)生循環(huán)引用。
標(biāo)記-清除原理:
“標(biāo)記-清除”不改動(dòng)真實(shí)的引用計(jì)數(shù),而是將
集合中對(duì)象的引用計(jì)數(shù)復(fù)制一份副本,改動(dòng)該對(duì)象引用的副本。對(duì)于副
本做任何的改動(dòng),都不會(huì)影響到對(duì)象生命走起的維護(hù)。
3、分代回收
分代回收原理:
將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時(shí)間劃分為不同的集合,
每一個(gè)集合就成為一個(gè)“代”,垃圾收集的頻率隨著“代”的存活時(shí)間的增大而減小。
也就是說(shuō),活得越長(zhǎng)的對(duì)象,就越不可能是垃圾,就應(yīng)該減少對(duì)它的垃圾收集頻率。
那么如何來(lái)衡量這個(gè)存活時(shí)間:通常是利用幾次垃圾收集動(dòng)作來(lái)衡量,
如果一個(gè)對(duì)象經(jīng)過(guò)的垃圾收集次數(shù)越多,可以得出:該對(duì)象存活時(shí)間就越長(zhǎng)。
以上就是談?wù)刾ython垃圾回收機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于python垃圾回收機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python采用django框架實(shí)現(xiàn)支付寶即時(shí)到帳接口
這篇文章主要介紹了python采用django框架實(shí)現(xiàn)支付寶即時(shí)到帳接口的相關(guān)資料,需要的朋友可以參考下2016-05-05
一文詳解CNN 解決 Flowers 圖像分類(lèi)任務(wù)
這篇文章主要為大家介紹了CNN 解決 Flowers 圖像分類(lèi)任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
python 兩個(gè)數(shù)據(jù)庫(kù)postgresql對(duì)比
這篇文章主要介紹了python 兩個(gè)數(shù)據(jù)庫(kù)postgresql對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Python實(shí)現(xiàn)SMTP發(fā)送郵件詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)SMTP發(fā)送郵件詳細(xì)教程,附SMTP郵件發(fā)送代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
淺談python3 構(gòu)造函數(shù)和析構(gòu)函數(shù)
這篇文章主要介紹了淺談python3 構(gòu)造函數(shù)和析構(gòu)函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
聊聊PyTorch中eval和no_grad的關(guān)系
這篇文章主要介紹了聊聊PyTorch中eval和no_grad的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
python裝飾器實(shí)現(xiàn)對(duì)異常代碼出現(xiàn)進(jìn)行自動(dòng)監(jiān)控的實(shí)現(xiàn)方法
這篇文章主要介紹了python裝飾器實(shí)現(xiàn)對(duì)異常代碼出現(xiàn)進(jìn)行自動(dòng)監(jiān)控的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

