Python中垃圾回收

熟悉C語言的同學(xué)可能對對象的構(gòu)造和析構(gòu)比較熟悉。所謂構(gòu)造函數(shù),就是對類進(jìn)行初始化,而析構(gòu)函數(shù)則是刪除對象,并提供一系列的清掃工作。
對比C語言,Python中的__new____init__基本可以完成構(gòu)造函數(shù)的工作,即初始化一個對象。而Python對于對象的垃圾回收則由語言層面來做,不用開發(fā)者顯示操作。今天就來簡單說一下,Python中的垃圾回收。
Python中的垃圾回收主要通過引用計數(shù)、標(biāo)記清除、分代技術(shù)來實(shí)現(xiàn)的:

  1. Python中每個對象都有一個叫做ob_refcnt的屬性,用來對該對象的引用進(jìn)行計數(shù),當(dāng)一個對象有了新的引用時(最常見的是被賦值給了一個變量),ob_refcnt屬性加一;相應(yīng)的,當(dāng)一個對象的某個引用被刪除了,它的ob_refcnt會減一。當(dāng)ob_refcnt減到0的時候,就可以將這個對象清除了。這種方法就叫做標(biāo)記清除。它的優(yōu)點(diǎn)是簡單高效,缺點(diǎn)在于對于循環(huán)引用的失效。
  2. 所謂標(biāo)記清除法,可以理解是先按需分配,等到需要清理空間的時候,去遍歷以對象為節(jié)點(diǎn),引用為邊的圖,將所有可以被訪問到的對象標(biāo)記,未被標(biāo)記的對象則被清除。這種方法可以解決循環(huán)引用帶來的潛在問題。
  3. 分代技術(shù),將所有對象按照存活時間分為不同的“代”,垃圾回收頻率隨著“代”的存活時間增加而減少。這種方法默認(rèn)的原則是存活越久的對象,需要被垃圾回收的概率就越低。由于提供了按“代”回收的思路,在一定程度上減小了垃圾回收所需要操作的空間范圍,提高了垃圾回收的效率,缺點(diǎn)在于某些高“代”的垃圾不能被實(shí)時清除,也就是犧牲了部分垃圾回收的效果來換取垃圾回收的效率的提升。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容