
python垃圾回收機(jī)制
現(xiàn)在的高級語言如java,c#等,都采用了垃圾收集機(jī)制,而不再是c,c++里用戶自己管理維護(hù)內(nèi)存的方式。自己管理內(nèi)存極其自由,可以任意申請內(nèi)存,但如同一把雙刃劍,為大量內(nèi)存泄露,懸空指針等bug埋下隱患。
對于一個(gè)字符串、列表、類甚至數(shù)值都是對象,且定位簡單易用的語言,自然不會(huì)讓用戶去處理如何分配回收內(nèi)存的問題。
python里也同java一樣采用了垃圾收集機(jī)制,不過不一樣的是,python采用的是引用計(jì)數(shù)機(jī)制為主,標(biāo)記-清除和分代收集兩種機(jī)制為輔的策略。
引用計(jì)數(shù)機(jī)制:
python里每一個(gè)東西都是對象,它們的核心就是一個(gè)結(jié)構(gòu)體:PyObject
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
}PyObject;
PyObject是每個(gè)對象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對象被刪除,它的ob_refcnt就會(huì)減少
** #define Py_INCREF(op) ((op)->ob_refcnt++) //增加計(jì)數(shù)**
**define Py_DECREF(op) //減少計(jì)數(shù) **
if (--(op)->ob_refcnt != 0) \
; \
else \
__Py_Dealloc((PyObject *)(op))
引用計(jì)數(shù)為0時(shí),該對象生命就結(jié)束了。
引用計(jì)數(shù)機(jī)制的優(yōu)點(diǎn):
1、簡單
2、實(shí)時(shí)性:一旦沒有引用,內(nèi)存就直接釋放了。不用像其他機(jī)制等到特定時(shí)機(jī)。實(shí)時(shí)性還帶來一個(gè)好處:處理回收內(nèi)存的時(shí)間分?jǐn)偟搅似綍r(shí)。
引用計(jì)數(shù)機(jī)制的缺點(diǎn):
1、維護(hù)引用計(jì)數(shù)消耗資源
2、循環(huán)引用
1
list1 = []
2
list2 = []
3
list1.append(list2)
4
list2.append(list1) , list1與list2相互引用,如果不存在其他對象對它們的引用,list1與list2的引用計(jì)數(shù)也仍然為1,所占用的內(nèi)存永遠(yuǎn)無法被回收,這將是致命的。
對于如今的強(qiáng)大硬件,缺點(diǎn)1尚可接受,但是循環(huán)引用導(dǎo)致內(nèi)存泄露,注定python還將引入新的回收機(jī)制。
上面說到python里回收機(jī)制是以引用計(jì)數(shù)為主,標(biāo)記-清除和分代收集兩種機(jī)制為輔。
1、標(biāo)記-清除機(jī)制
標(biāo)記-清除機(jī)制,顧名思義,首先標(biāo)記對象(垃圾檢測),然后清除垃圾(垃圾回收)。如圖1:
這里寫圖片描述
圖1
首先初始所有對象標(biāo)記為白色,并確定根節(jié)點(diǎn)對象(這些對象是不會(huì)被刪除),標(biāo)記它們?yōu)楹谏ū硎緦ο笥行В?。將有效對象引用的對象?biāo)記為灰色(表示對象可達(dá),
但它們所引用的對象還沒檢查),檢查完灰色對象引用的對象后,將灰色標(biāo)記為黑色。重復(fù)直到不存在灰色節(jié)點(diǎn)為止。最后白色結(jié)點(diǎn)都是需要清除的對象。
2、回收對象的組織
這里所采用的高級機(jī)制作為引用計(jì)數(shù)的輔助機(jī)制,用于解決產(chǎn)生的循環(huán)引用問題。而循環(huán)引用只會(huì)出現(xiàn)在“內(nèi)部存在可以對其他對象引用的對象”,比如:list,class等。
為了要將這些回收對象組織起來,需要建立一個(gè)鏈表。自然,每個(gè)被收集的對象內(nèi)就需要多提供一些信息,下面代碼是回收對象里必然出現(xiàn)的。
一個(gè)對象的實(shí)際結(jié)構(gòu)如圖2:
這里寫圖片描述
圖2
通過PyGC_Head的指針將每個(gè)回收對象連接起來,形成了一個(gè)鏈表,也就是在1里提到的初始化的所有對象。
3、分代技術(shù)
分代技術(shù)是一種典型的以空間換時(shí)間的技術(shù),這也正是java里的關(guān)鍵技術(shù)。這種思想簡單點(diǎn)說就是:對象存在時(shí)間越長,越可能不是垃圾,應(yīng)該越少去收集。
這樣的思想,可以減少標(biāo)記-清除機(jī)制所帶來的額外操作。分代就是將回收對象分成數(shù)個(gè)代,每個(gè)代就是一個(gè)鏈表(集合),代進(jìn)行標(biāo)記-清除的時(shí)間與代內(nèi)對象
存活時(shí)間成正比例關(guān)系。
從上面代碼可以看出python里一共有三代,每個(gè)代的threshold值表示該代最多容納對象的個(gè)數(shù)。默認(rèn)情況下,當(dāng)0代超過700,或1,2代超過10,垃圾回收機(jī)制將觸發(fā)。
0代觸發(fā)將清理所有三代,1代觸發(fā)會(huì)清理1,2代,2代觸發(fā)后只會(huì)清理自己。
下面是一個(gè)完整的收集流程:鏈表建立,確定根節(jié)點(diǎn),垃圾標(biāo)記,垃圾回收~
1、鏈表建立
首先,中里在分代技術(shù)說過:0代觸發(fā)將清理所有三代,1代觸發(fā)會(huì)清理1,2代,2代觸發(fā)后只會(huì)清理自己。在清理0代時(shí),會(huì)將三個(gè)鏈表(代)鏈接起來,清理1代的時(shí),會(huì)鏈接1,2兩代。在后面三步,都是針對的這個(gè)建立之后的鏈表。
2、確定根節(jié)點(diǎn)
圖1為一個(gè)例子。list1與list2循環(huán)引用,list3與list4循環(huán)引用。a是一個(gè)外部引用。
這里寫圖片描述
對于這樣一個(gè)鏈表,我們?nèi)绾蔚贸龈?jié)點(diǎn)呢。python里是在引用計(jì)數(shù)的基礎(chǔ)上又提出一個(gè)有效引用計(jì)數(shù)的概念。顧名思義,有效引用計(jì)數(shù)就是去除循環(huán)引用后的計(jì)數(shù)。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03