賦值語句分析內(nèi)存
使用id()方法訪問內(nèi)存地址
對于比較小的int數(shù)據(jù)期贫,內(nèi)存地址不變跟匆,反之超過一定范圍就會改變
思考下面代碼的輸出結(jié)果
一般會認為輸出結(jié)果為: [11], [678]唯灵, ['666']
其實結(jié)果如下:
垃圾回收機制
以引用計數(shù)為主贾铝,分代收集為輔
如果一個對象的引用數(shù)為0,python虛擬機就會回收這個對象的內(nèi)存
引用計數(shù)的缺陷是循環(huán)引用的問題
引用計數(shù)(reference count)
每個對象都有存有指向該對象的引用總數(shù)
查看某個對象的引用計數(shù)
? ? ? ? sys.getrefcount()
可以使用del關(guān)鍵字刪除某個引用
垃圾回收
滿足特定條件埠帕,自動啟動垃圾回收
當python運行時垢揩,會記錄其中分配對象(object allocation)和取消分配對象(object deallocation)的次數(shù)
當兩者的差值高于某個閾值時,垃圾回收才會啟動
查看閾值gc.get_threshold()
分代回收
python將所有的對象分為0敛瓷,1叁巨,2三代
所有新建對象都是0代對象
當某一代對象經(jīng)歷過垃圾回收呐籽,依舊存活蚀瘸,那么它就被歸入下一代對象
內(nèi)存池(memory pool)機制
當創(chuàng)建大量消耗小內(nèi)存的對象時,頻繁調(diào)用new/mallc會導致大量的內(nèi)存碎片贮勃,致使效率降低。
內(nèi)存池的概念就是預先在內(nèi)存中申請一定數(shù)量的苏章,大小相等的內(nèi)存塊留作備用寂嘉,當有新的內(nèi)存需求時,就先從內(nèi)存池中分配內(nèi)存給這個需求泉孩,不夠了之后再申請新的內(nèi)存。這樣做顯著的優(yōu)勢就是能夠減少內(nèi)存碎片并淋,提升效率。
python3中的內(nèi)存管理機制------pymalloc
? ? 針對小對象(<=512B),pymalloc會在內(nèi)存池中申請內(nèi)存空間
? ? 當>512B,則會PyMem_RawMalloc()和PyMem_RawRealloc()來申請新的內(nèi)存空間