更新時(shí)間:2021年03月05日18時(shí)12分 來(lái)源:傳智教育 瀏覽次數(shù):
Python中主要通過(guò)引用計(jì)數(shù)和內(nèi)存池機(jī)制進(jìn)行內(nèi)存管理。
一、引用計(jì)數(shù)機(jī)制
Python內(nèi)部使用引用計(jì)數(shù)(記錄對(duì)象有多少個(gè)引用)來(lái)保持追蹤內(nèi)存中的對(duì)象,當(dāng)對(duì)象被創(chuàng)建時(shí),該對(duì)象的引用計(jì)數(shù)加1;當(dāng)對(duì)象被銷(xiāo)毀時(shí),該對(duì)象的引用計(jì)數(shù)變?yōu)?,它會(huì)被當(dāng)做垃圾進(jìn)行回收。
引用計(jì)數(shù)增加的情況
(1)對(duì)象被創(chuàng)建,如x=4。
(2)賦值給其它變量,如y=x。
(3)被作為參數(shù)傳遞給函數(shù),如foo(x)。
(4)作為容器對(duì)象的一個(gè)元素,如a=[1,x,'33']。
引用計(jì)數(shù)減少的情況
(1)對(duì)象的引用離開(kāi)它的作用域,比如, foo(x)函數(shù)執(zhí)行結(jié)束時(shí),x引用的對(duì)象引用計(jì)數(shù)減1。
(2)對(duì)象的引用被顯式地銷(xiāo)毀,如del x或del y。
(3)對(duì)象的別名被賦值給其他對(duì)象,x=789。
(4)對(duì)象從窗口對(duì)象中被移除,a.remove(x)。
垃圾回收
(1)垃圾收集器會(huì)回收引用計(jì)數(shù)為0的對(duì)象,并清除這些對(duì)象占用的內(nèi)存空間。
(2)當(dāng)兩個(gè)對(duì)象相互引用時(shí),若它們沒(méi)有被其它引用所持有,則會(huì)被垃圾收集器回收。
(3)垃圾回收機(jī)制還有一個(gè)循環(huán)垃圾回收器,它可以確保釋放循環(huán)引用對(duì)象(a引用b, b引用a)。
二、內(nèi)存池機(jī)制
在Python中,很多時(shí)候申請(qǐng)的內(nèi)存都是小塊內(nèi)存,這些小塊內(nèi)存在申請(qǐng)不久后又會(huì)被釋放,這就意味著程序在運(yùn)行期間會(huì)大量地執(zhí)行申請(qǐng)和釋放操作,影響Python的執(zhí)行效率。為了加快Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
Python中所有小于256個(gè)字節(jié)的對(duì)象都使用內(nèi)存池的分配器。另外,一些Python對(duì)象,如整數(shù)、浮點(diǎn)數(shù)或列表,都擁有獨(dú)立的內(nèi)存池,對(duì)象之間不會(huì)共享這些獨(dú)立的內(nèi)存池。也就是說(shuō),若分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存池將不再分配給浮點(diǎn)數(shù)。
猜你喜歡:
Python常見(jiàn)的數(shù)據(jù)類(lèi)型有哪些?
TCP和UDP的優(yōu)缺點(diǎn)|TCP和UDP的優(yōu)缺點(diǎn)對(duì)比
2021-02-26HTTP通信機(jī)制中的一次完整通信過(guò)程的7個(gè)步驟
2021-02-26什么是孤兒進(jìn)程和僵尸進(jìn)程?如何避免僵尸進(jìn)程?
2021-02-26Python實(shí)戰(zhàn)開(kāi)發(fā)項(xiàng)目視頻教程:美多商城開(kāi)發(fā)實(shí)戰(zhàn)【傳智教育】
2021-02-22NumPy數(shù)組有幾種創(chuàng)建方法?
2021-02-03complie()函數(shù)預(yù)編譯正則表達(dá)式
2021-01-28北京校區(qū)