賦值語句分析內(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)存空間