久久久精品2019免费观看_亚洲国产精品成人久久久_69国产成人综合久久精品91_国产精品久久精品视

Python 標(biāo)記清除機(jī)制

在講標(biāo)記清除之前,我們先講一個(gè)知識(shí)點(diǎn)。就是我們前面講了變量值在內(nèi)存的存儲(chǔ)方式,就是開辟內(nèi)存空間,把值存進(jìn)去。但是一直沒有講過變量名是存在哪里的,毫無疑問,變量名也是存在內(nèi)存里的,至于到底怎么存的,我們來看一下。

當(dāng)我們定義變量的時(shí)候,它有兩部分要存,一部分是變量名,一部分是變量值。在內(nèi)存里也是對應(yīng)兩塊空間的。

我這里有個(gè)圖,一個(gè)空間叫棧區(qū),它專門用來存放變量名的,另一個(gè)空間叫堆取,它是專門用來存放變量值的。當(dāng)我們定義一個(gè)name=‘張大仙’的時(shí)候,這時(shí)候在堆區(qū)里會(huì)申請一塊內(nèi)存空間,把值‘張大仙’存進(jìn)去,對應(yīng)一個(gè)內(nèi)存地址。

然后在棧區(qū)里存放一個(gè)name,對應(yīng)上剛剛的內(nèi)存地址。當(dāng)堆區(qū)的內(nèi)存地址引用計(jì)數(shù)為0被清除的時(shí)候,對應(yīng)棧區(qū)的變量名也會(huì)被清除。

好!堆區(qū)和棧區(qū)咱們簡單了解一下就行了。

現(xiàn)在我們來看上章循環(huán)引用的案例。首先是列表l1,里面存了三個(gè)值,分別是‘a(chǎn)’,‘b’和列表l2的內(nèi)存地址,然后列表l2存放了‘x’,‘y’和列表l1的內(nèi)存地址

就是列表1間接引用了列表2的內(nèi)存地址,列表2間接引用了列表1的內(nèi)存地址,然后它們各自的變量名直接引用了各自內(nèi)存地址。

當(dāng)我們執(zhí)行del l1之后,l1這個(gè)變量名就和它指向的內(nèi)存地址接觸綁定了。這時(shí)堆區(qū)里的這個(gè)l1被l2間接引用著的,所以不會(huì)被回收。

等待執(zhí)行del l2的時(shí)候l2和它指向的內(nèi)存地址也接除綁定了。這時(shí)候堆區(qū)里的l2有被上面的l1間接引用著的,所以l2也不會(huì)被回收。但是這兩個(gè)列表沒有直接引用了,意味著我們訪問不到這兩個(gè)列表了,這兩個(gè)內(nèi)存就泄露了

這時(shí)候就可以使用Python為我們提供的解決方法標(biāo)記清除。

標(biāo)記清除會(huì)在你內(nèi)存空間不夠用的時(shí)候?qū)⒛阏麄€(gè)程序暫停下來,掃描棧區(qū),把通過棧區(qū)所有能引用到的值,不管是通過棧區(qū)直接引用還是間接引用到的,都標(biāo)記為存活狀態(tài),一旦發(fā)現(xiàn)棧區(qū)引用不到的值都標(biāo)記為死亡狀態(tài),死亡狀態(tài)的值會(huì)被直接清理掉。

就算他身上的引用計(jì)數(shù)不為0,只要我們訪問不到它了,標(biāo)記清除就會(huì)把它標(biāo)記為垃圾,然后回收掉。

我舉個(gè)簡單的例子你就明白了,你去遛狗,但是你沒牽繩,一旦被城管發(fā)現(xiàn)了就會(huì)把你的狗回收掉。這個(gè)城管就相當(dāng)于Python的標(biāo)記清除機(jī)制。

未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python 標(biāo)記清除機(jī)制

贊 (1) 打賞

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

微信掃一掃打賞