內(nèi)存管理機(jī)制

賦值語句分析內(nèi)存

使用id()方法訪問內(nèi)存地址

對于比較小的int數(shù)據(jù),內(nèi)存地址不變,反之超過一定范圍就會改變


思考下面代碼的輸出結(jié)果

一般會認(rèn)為輸出結(jié)果為: [11], [678], ['666']

其實結(jié)果如下:


垃圾回收機(jī)制

以引用計數(shù)為主,分代收集為輔

如果一個對象的引用數(shù)為0,python虛擬機(jī)就會回收這個對象的內(nèi)存

引用計數(shù)的缺陷是循環(huán)引用的問題


引用計數(shù)(reference count)

每個對象都有存有指向該對象的引用總數(shù)

查看某個對象的引用計數(shù)

? ? ? ? sys.getrefcount()

可以使用del關(guān)鍵字刪除某個引用


垃圾回收

滿足特定條件,自動啟動垃圾回收

當(dāng)python運(yùn)行時,會記錄其中分配對象(object allocation)和取消分配對象(object deallocation)的次數(shù)

當(dāng)兩者的差值高于某個閾值時,垃圾回收才會啟動

查看閾值gc.get_threshold()


分代回收

python將所有的對象分為0,1,2三代

所有新建對象都是0代對象

當(dāng)某一代對象經(jīng)歷過垃圾回收,依舊存活,那么它就被歸入下一代對象


內(nèi)存池(memory pool)機(jī)制

當(dāng)創(chuàng)建大量消耗小內(nèi)存的對象時,頻繁調(diào)用new/mallc會導(dǎo)致大量的內(nèi)存碎片,致使效率降低。

內(nèi)存池的概念就是預(yù)先在內(nèi)存中申請一定數(shù)量的,大小相等的內(nèi)存塊留作備用,當(dāng)有新的內(nèi)存需求時,就先從內(nèi)存池中分配內(nèi)存給這個需求,不夠了之后再申請新的內(nèi)存。這樣做顯著的優(yōu)勢就是能夠減少內(nèi)存碎片,提升效率。

python3中的內(nèi)存管理機(jī)制------pymalloc

? ? 針對小對象(<=512B),pymalloc會在內(nèi)存池中申請內(nèi)存空間

? ? 當(dāng)>512B,則會PyMem_RawMalloc()和PyMem_RawRealloc()來申請新的內(nèi)存空間

?著作權(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ù)。

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