简述python垃圾回收机制_python中的垃圾回收机制简述
2020年12月5日21:47:35 王凱玉
python中的垃圾回收機(jī)制
引用計(jì)數(shù)
# 引用計(jì)數(shù)
引用計(jì)數(shù)是編程語(yǔ)言中的一中內(nèi)存管理技術(shù),可以將資源的被引用次數(shù)保存起來。
當(dāng)引用計(jì)數(shù)為0時(shí),資源將被釋放
# 如何讓引用計(jì)數(shù)減少
del語(yǔ)句會(huì)刪除對(duì)象的一個(gè)引用,這將導(dǎo)致該引用指向的對(duì)象的引用計(jì)數(shù)-1
# 引用計(jì)數(shù)會(huì)導(dǎo)致什么問題
由于兩個(gè)或多個(gè)對(duì)象相互引用時(shí),彼此引用計(jì)數(shù)不為0,造成循環(huán)引用無(wú)法回收,但是可以用標(biāo)記清除機(jī)制來解決。
# 如何查看引用計(jì)數(shù)
import sys
sys.getrefcount(obj)
標(biāo)記清除
# 標(biāo)記清除
標(biāo)記清除分為兩個(gè)階段:先標(biāo)記對(duì)象(垃圾檢測(cè))、再清除垃圾(垃圾回收)
# 標(biāo)記
在這個(gè)階段,垃圾回收器會(huì)先從根對(duì)象開始遍歷,每一個(gè)可以從根對(duì)象訪問到的對(duì)象都會(huì)被添加標(biāo)記,這個(gè)對(duì)象就會(huì)被標(biāo)識(shí)為可到達(dá)對(duì)象(不會(huì)被清除)
# 清除
這時(shí)候,垃圾回收器就會(huì)對(duì)堆內(nèi)存從頭到尾進(jìn)行線性遍歷,如果發(fā)現(xiàn)有對(duì)象沒有被標(biāo)識(shí)成可多達(dá)對(duì)象,就會(huì)把該對(duì)象回收,之后再講原來標(biāo)記為可到達(dá)對(duì)象的標(biāo)識(shí)抹掉,以便進(jìn)行下一次的垃圾回收操作。
# 標(biāo)記清除有什么問題
標(biāo)記清除算法最大的缺點(diǎn)就是垃圾收集后有可能造成大量的內(nèi)存碎片,其次就是,由當(dāng)遍歷的內(nèi)存節(jié)點(diǎn)較多時(shí),每次回收都會(huì)花費(fèi)很多的時(shí)間在遍歷上。
# 常見的名詞
collector:垃圾收集器
mutator:垃圾收集器之外的部分,比如當(dāng)前的應(yīng)用程序
mutator roots:是mutator的根對(duì)象,通常是分配在對(duì)內(nèi)存之外,可以直接被訪問到的對(duì)象,一般就是指靜態(tài)的全局變量。
可到達(dá)對(duì)象:從根對(duì)象開始遍歷,可以訪問到的對(duì)象,也就是mutator正在使用的對(duì)象。
分代回收
# 分代回收
分代回收是一種典型的以空間換時(shí)間的技術(shù)。
簡(jiǎn)單說就是把回收對(duì)象分成多個(gè)代,比如青年代、中年代、老年代。每一個(gè)代都是一個(gè)集合。
當(dāng)青年代滿了的時(shí)候,就會(huì)對(duì)所有代執(zhí)行標(biāo)記清除動(dòng)作,中年代滿了,就會(huì)清理中年代和老年代,老年代滿了只會(huì)清理自己(老年代的存活時(shí)間是最長(zhǎng)的)
總結(jié)
以上是生活随笔為你收集整理的简述python垃圾回收机制_python中的垃圾回收机制简述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: g120变频器报7490怎么处理_西门子
- 下一篇: flask html下拉列表,如何使用F