python是基于什么的内存管理方式_为什么说Python采用的是基于值的内存管理模式...
內(nèi)存管理架構(gòu):
1.python的內(nèi)存管理機(jī)制由兩部分組成,其由PYMALLOC_DEBUG控制,在debug模式下的內(nèi)存管理機(jī)制和正常模式下的內(nèi)存管理模式。
2.python的內(nèi)存管理機(jī)制可以抽象成一種層次結(jié)構(gòu):
最底層:操作系統(tǒng)提供的內(nèi)存管理接口,由其實(shí)現(xiàn)并維護(hù)
第一層:對(duì)最底層的包裝,為python提供統(tǒng)一的原生內(nèi)存管理接口和面向python中類型的內(nèi)存分配器。簡(jiǎn)單地說,C語言中的malloc是需要用戶自行提供申請(qǐng)空間的大小,而python可以由類型和數(shù)量自行判斷內(nèi)存空間大小
第二層:提供創(chuàng)建python對(duì)象的接口
第三層:為常用對(duì)象提供更抽象的內(nèi)存管理策略,如整數(shù),字符串,主要是對(duì)象緩存池機(jī)制 小塊空間的內(nèi)存池
1.python的內(nèi)存池機(jī)制,用于小塊內(nèi)存的申請(qǐng)和釋放,同樣也有四層層次結(jié)構(gòu)組成,分別是block,pool,arena和內(nèi)存池。
第一層block:確定大小的內(nèi)存塊,大小有相應(yīng)的劃分且有上限
第二層pool:一組block的集合叫pool,最重要的pool_header和freeblock鏈表
第三層arena:一組pool的集合,分已使用和未使用兩種狀態(tài)
第四層內(nèi)存池:Python中當(dāng)申請(qǐng)內(nèi)存超過某個(gè)值就啟動(dòng)malloc行為,當(dāng)?shù)陀谶@個(gè)值才進(jìn)行內(nèi)存池申請(qǐng)內(nèi)存,根據(jù)申請(qǐng)內(nèi)存的大小獲得對(duì)應(yīng)的序號(hào),如果已使用的pool中有可用的pool,則用其分配block,否則從已用arena中獲取pool,否則申請(qǐng)arena,成功獲取后開始初始化 循環(huán)引用的垃圾收集
1.python中的垃圾回收是基于對(duì)象的引用計(jì)數(shù)實(shí)現(xiàn)的,也就是說對(duì)象的生命周期是由對(duì)象的引用計(jì)數(shù)管理的。同時(shí)帶來效率的降低,所以引入內(nèi)存池機(jī)制,使得常用對(duì)象能更高效
2.引用計(jì)數(shù)機(jī)制致命缺點(diǎn)是在循環(huán)引用下容易引起內(nèi)存泄漏,為了克服循環(huán)引用帶來的問題,引入了其他垃圾回收機(jī)制,也就是主流垃圾收集技術(shù)中的標(biāo)記(清除和分代收集技術(shù))
3.三色標(biāo)記模型,也就是標(biāo)記--清除技術(shù),步驟如下:
先找到根對(duì)象然后遍歷搜索,能到達(dá)的不可刪除,不能到達(dá)的可能刪除
4.垃圾收集機(jī)制針對(duì)循環(huán)引用的出現(xiàn),PyIntObject,PyStringObject是不會(huì)出現(xiàn)引用的,只有container對(duì)象才會(huì)出現(xiàn)引用,所以補(bǔ)充的垃圾回收機(jī)制是對(duì)容器類型對(duì)象創(chuàng)建收集鏈表,清除鏈表中循環(huán)引用的對(duì)象
5.分化收集技術(shù)是java采用的垃圾回收機(jī)制,就是將內(nèi)存根據(jù)生命周期長(zhǎng)短進(jìn)行內(nèi)存分化制,python將內(nèi)存分成三個(gè)化,有一個(gè)化滿了就將其他化連接到其后進(jìn)行垃圾回收
6.需要注意的是對(duì)類對(duì)象的回收,在類中創(chuàng)建del方法容易引起無法回收的情況
總結(jié)
以上是生活随笔為你收集整理的python是基于什么的内存管理方式_为什么说Python采用的是基于值的内存管理模式...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画决策树_Python绘制决
- 下一篇: 用Python构建和可视化决策树