簡(jiǎn)單了解python的內(nèi)存管理機(jī)制
Python引入了一個(gè)機(jī)制:引用計(jì)數(shù)。
引用計(jì)數(shù)
python內(nèi)部使用引用計(jì)數(shù),來(lái)保持追蹤內(nèi)存中的對(duì)象,Python內(nèi)部記錄了對(duì)象有多少個(gè)引用,即引用計(jì)數(shù),當(dāng)對(duì)象被創(chuàng)建時(shí)就創(chuàng)建了一個(gè)引用計(jì)數(shù),當(dāng)對(duì)象不再需要時(shí),這個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí),它被垃圾回收。
總結(jié)一下對(duì)象會(huì)在一下情況下引用計(jì)數(shù)加1:
1.對(duì)象被創(chuàng)建:x=4
2.另外的別人被創(chuàng)建:y=x
3.被作為參數(shù)傳遞給函數(shù):foo(x)
4.作為容器對(duì)象的一個(gè)元素:a=[1,x,'33']
引用計(jì)數(shù)減少情況
1.一個(gè)本地引用離開了它的作用域。比如上面的foo(x)函數(shù)結(jié)束時(shí),x指向的對(duì)象引用減1。
2.對(duì)象的別名被顯式的銷毀:del x ;或者del y
3.對(duì)象的一個(gè)別名被賦值給其他對(duì)象:x=789
4.對(duì)象從一個(gè)窗口對(duì)象中移除:myList.remove(x)
5.窗口對(duì)象本身被銷毀:del myList,或者窗口對(duì)象本身離開了作用域。
垃圾回收
1、當(dāng)內(nèi)存中有不再使用的部分時(shí),垃圾收集器就會(huì)把他們清理掉。它會(huì)去檢查那些引用計(jì)數(shù)為0的對(duì)象,然后清除其在內(nèi)存的空間。當(dāng)然除了引用計(jì)數(shù)為0的會(huì)被清除,還有一種情況也會(huì)被垃圾收集器清掉:當(dāng)兩個(gè)對(duì)象相互引用時(shí),他們本身其他的引用已經(jīng)為0了。
2、垃圾回收機(jī)制還有一個(gè)循環(huán)垃圾回收器, 確保釋放循環(huán)引用對(duì)象(a引用b, b引用a, 導(dǎo)致其引用計(jì)數(shù)永遠(yuǎn)不為0)。
在Python中,許多時(shí)候申請(qǐng)的內(nèi)存都是小塊的內(nèi)存,這些小塊內(nèi)存在申請(qǐng)后,很快又會(huì)被釋放,由于這些內(nèi)存的申請(qǐng)并不是為了創(chuàng)建對(duì)象,所以并沒有對(duì)象一級(jí)的內(nèi)存池機(jī)制。這就意味著Python在運(yùn)行期間會(huì)大量地執(zhí)行malloc和free的操作,頻繁地在用戶態(tài)和核心態(tài)之間進(jìn)行切換,這將嚴(yán)重影響Python的執(zhí)行效率。為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
內(nèi)存池機(jī)制
Python提供了對(duì)內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
Python中所有小于256個(gè)字節(jié)的對(duì)象都使用pymalloc實(shí)現(xiàn)的分配器,而大的對(duì)象則使用系統(tǒng)的 malloc。另外Python對(duì)象,如整數(shù),浮點(diǎn)數(shù)和List,都有其獨(dú)立的私有內(nèi)存池,對(duì)象間不共享他們的內(nèi)存池。也就是說(shuō)如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章

python使用requests實(shí)現(xiàn)發(fā)送帶文件請(qǐng)求功能

使用Python中的線程進(jìn)行網(wǎng)絡(luò)編程的入門教程

使用python監(jiān)測(cè)網(wǎng)絡(luò)連接和網(wǎng)速的實(shí)現(xiàn)代碼

python+selenium實(shí)現(xiàn)163郵箱自動(dòng)登陸的方法