您好,登錄后才能下訂單哦!
了解python內(nèi)存管理機(jī)制的案例分析?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
語言的內(nèi)存管理是語言設(shè)計(jì)的一個(gè)重要方面。它是決定語言性能的重要因素。無論是C語言的手工管理,還是Java的垃圾回收,都成為語言最重要的特征。這里以Python語言為例子,說明一門動(dòng)態(tài)類型的、面向?qū)ο蟮恼Z言的內(nèi)存管理方式。
一句話概括:引用計(jì)數(shù)為主,清除標(biāo)記,分代回收為輔
python的垃圾回收(3種)
引用計(jì)數(shù)
當(dāng)對(duì)象的引用的計(jì)數(shù)器變?yōu)?的時(shí)候,該對(duì)象可能在內(nèi)存中,但是已經(jīng)不能訪問。python的垃圾回收時(shí)候不能做其他操作,如果一個(gè)對(duì)象的引用計(jì)數(shù)變?yōu)?的時(shí)候python就去回收該對(duì)象,那么很顯然Python的效率會(huì)很差,那什么時(shí)候python會(huì)來回收呢?這是一個(gè)好問題。
python會(huì)監(jiān)聽自己new了多少個(gè)新的對(duì)象和有多少對(duì)象的引用計(jì)數(shù)器變?yōu)?了,兩個(gè)數(shù)值做差的到的數(shù)和閾值去比較,大于閾值,內(nèi)存開始進(jìn)行垃圾回收,銷毀引用計(jì)數(shù)器為0的對(duì)象。
優(yōu)點(diǎn):簡單實(shí)時(shí)性,缺點(diǎn):維護(hù)引用計(jì)數(shù)消耗資源,循環(huán)引用。
分代回收
為了提高效率,有很多對(duì)象,清理了很多次他依然存在,可以認(rèn)為,這樣的對(duì)象不需要經(jīng)常回收,可以把它分到不同的集合,每個(gè)集合回收的時(shí)間間隔不同。簡單的說這就是python的分代回收。
具體說一下,python中的垃圾分為1,2,3代,在1代里的對(duì)象每次回收都會(huì)去清理,當(dāng)清理后有引用的對(duì)象依然存在,此時(shí)他會(huì)進(jìn)入2代集合,同理2代集合清理的時(shí)候存在的對(duì)象會(huì)進(jìn)入2代集合。
每個(gè)集合的清理時(shí)間如何分配,會(huì)先清理1代垃圾,當(dāng)清理10次一代垃圾后會(huì)清理一次2代垃圾,當(dāng)清理10次2代垃圾后會(huì)清理2代垃圾。
標(biāo)記清除
按需分配,當(dāng)內(nèi)存不夠的時(shí)候,從寄存器和程序棧上的引用出發(fā),遍歷對(duì)象,將遍歷的對(duì)象打上標(biāo)記,然后在內(nèi)存中清除沒有標(biāo)記的對(duì)象。
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)python內(nèi)存管理機(jī)制的案例分析大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。