<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 對比Ruby和Python的垃圾回收

對比Ruby和Python的垃圾回收

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò ) 收藏
mark-and-swfbdfdfbeep2

上面三個(gè)”M”標記的對象為活躍對象,依然被我們的程序使用。在解釋器內部,通常使用”free bitmap”的數據結構來(lái)保存一個(gè)對象是否被標記:

mark-anfdgdgdgd-sweep3

將”free bitmap”保存在一個(gè)獨立的內存區域,以便可以更好的利用Unix的”copy-on-write”特性。更詳細的信息,請參考我的另一篇文章《為什么2.0的器讓我們如此興奮》。

如果活躍對象被標記了,那么其余的便是垃圾對象,意味著(zhù)它們不再會(huì )被代碼使用。在下圖中,我使用白色的方塊表示垃圾對象:

mafdbdffdbrk-and-sweep4

接下來(lái),Ruby將清理沒(méi)有使用的,垃圾對象,將它們鏈入空閑對象鏈表(free list):

gfhghfghtrhtrhjjrt-sweet5

在解釋器內部,這個(gè)過(guò)程非常迅速,Ruby并不會(huì )真正的將對象從一個(gè)地方拷貝到另一個(gè)地方。相反的,Ruby會(huì )將垃圾對象組成一個(gè)新的鏈表,并且鏈入空閑對象鏈表(free list)。

現在,當我們要創(chuàng )建一個(gè)新的Ruby對象的時(shí)候,Ruby將為我們返回收集的垃圾對象。在Ruby中,對象是可以重生的,享受著(zhù)多次的生命!

標記回收算法 vs. 引用計數算法

咋一看,算法對于Ruby來(lái)說(shuō)是相當讓人感到驚訝的:既然可以生活在一個(gè)整潔干凈的房間,為什么要生活在一個(gè)臟亂的房間呢?為什么Ruby周期性的強制停止程序的運行去清理垃圾,而不使用的算法呢?

然而,引用計數實(shí)現起來(lái)不會(huì )像它看起來(lái)那樣簡(jiǎn)單。這里有一些許多語(yǔ)言不愿像一樣使用引用計數算法的原因:

首先,實(shí)現起來(lái)很困難。Python必須為每一個(gè)對象留有一定的空間來(lái)保存引用計數。這會(huì )導致一些細微的內存開(kāi)銷(xiāo)。但更遭的是,一個(gè)簡(jiǎn)答的操作例如改變一個(gè)變量或引用將導致復雜的操作,由于Python需要增加一個(gè)對象的計數,減少另一個(gè)對象的計數,有可能釋放一個(gè)對象。

其次,它會(huì )減慢速度。盡管Python在程序運行過(guò)程中的過(guò)程非常順暢(當你把臟盤(pán)子放到水槽后,它立馬清洗干凈),但是運行的并不十分迅速。Python總是在更新引用計數。并且當你停止使用一個(gè)巨大的數據結構時(shí),例如一個(gè)包含了大量元素的序列,Python必須一次釋放許多對象。減少引用計數可能是一個(gè)復雜的,遞歸的過(guò)程。

最后,它并不總是工作的很好。在我演講的下一部分,也就是下一篇帖子中能看到,引用計數不能處理循環(huán)引用數據結構,它包含循環(huán)引用。

下一次…

下周我將發(fā)布演講的其他部分。我將討論Python怎樣處理循環(huán)引用數據結構,以及在即將到來(lái)的Ruby2.1中,垃圾回收器是怎樣工作的。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: Ruby Python 垃圾回收

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>