<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ò ) 收藏

當然內部也會(huì )由于各種原因使用空閑對象鏈表(它使用鏈表循環(huán)確定對象),為對象和值分配內存的方式常常不同于。

本文引用地址:http://dyxdggzs.com/article/201609/304199.htm

假設我們創(chuàng )建一個(gè)Node對象使用

pythobvdfbfdbdfbn1

Python不同于,當你創(chuàng )建對象的時(shí)候,Python會(huì )立即向操作系統申請分配內存。(Python 事實(shí)上實(shí)現了自己的內存分配系統,它在操作系統內存堆上提供了另外一層抽象,但是今天沒(méi)有事件深入探討。 )

當我們創(chuàng )建第二個(gè)對象時(shí),Python將再次向操作系統申請更多的內存:

python2fbfdhhrt

看起來(lái)相當簡(jiǎn)單,當我們創(chuàng )建Python對象的時(shí)刻,將花費事件申請內存。

menbfgnfgnfhss

將沒(méi)有用的對象扔的到處都是,直到下一個(gè)過(guò)程

Ruby開(kāi)發(fā)者生活在一個(gè)臟亂的房間

回到Ruby,由于我們分配越來(lái)越多的對象,Ruby將繼續為我們從空閑對象鏈表(free list)獲取預分配對象。因此,空閑對象鏈表將變得越來(lái)越短:

fregergregrgge-list4

或者更短:

freederfreferfg-list5

請注意,我將一個(gè)新的值賦給了n1,Ruby會(huì )遺留下舊的值。”ABC”, “JKL”和”MNO”等結點(diǎn)對象會(huì )依然保留在內存中。Ruby不會(huì )立即清理舊的對象盡管程序不再使用!作為一名Ruby開(kāi)發(fā)者就像生活在一個(gè)臟亂的房間,衣服隨意的仍在地板上,廚房的水槽中堆滿(mǎn)了臟盤(pán)子。作為一個(gè)Ruby開(kāi)發(fā)者,你必須在一大堆垃圾對象中去工作。

clfgdgergerggrean

當你的程序不在使用任何對象的時(shí)候,Python會(huì )立刻進(jìn)行清理。

Python開(kāi)發(fā)者生活在一所整潔的房子

機制在Python和Ruby中迥然不同,讓我們回到前面三個(gè)Python中Node對象的例子:

pythfgbfgbfgbnfgon3b

內部的,每當我們新建一個(gè)對象,Python將在對象對應的C語(yǔ)言結構中保存一個(gè)數字,叫做引用技術(shù)。最初,Python將它的值設為1。

pytefwefwefwefghon4

值為1表明每個(gè)對象有一個(gè)指針或引用指向它。假設我們創(chuàng )建一個(gè)新的對象,JKL:

pythgbfgbfbfgbon5

正如前面所說(shuō),Python將”JKL”的引用計數設置為1。同樣注意到我們改變n1指向了”JKL”,不再引用”ABC”,同時(shí)將”ABC”的引用計數減少為0。

通過(guò)這一點(diǎn),Python器將會(huì )立即執行!無(wú)論何時(shí),只要一個(gè)對象的引用計數變?yōu)?,python將立即釋放這個(gè)對象,并且將它的內存返回給操作系統。

pythgfbfgbfgnbfgnon6

上圖中,Python將回收”ABC”對象的內存。記住,Ruby只是將舊的對象遺留在那里并且不去釋放它們占用的內存。

這種垃圾回收算法被稱(chēng)為”引用計數”,由喬治柯林斯發(fā)明于1960年。非常巧合的是在同一年約翰麥卡錫大叔發(fā)明了”空閑對象鏈表算法”。正如Mike Bernstein在Ruby Conference大會(huì )上所說(shuō)”1960年是屬于垃圾回收器的…”。

作為一個(gè)Python開(kāi)發(fā)者,就像生活在一個(gè)整潔的房間中。你知道,你的室友有些潔癖,他會(huì )把你使用過(guò)的任何東西都清洗一遍。你把臟盤(pán)子,臟杯子一放到水槽中他就會(huì )清洗。

現在看另外一個(gè)例子,假設我們讓n2和n1指向同樣的結點(diǎn):

pytvwefwefwefhon8

上圖左邊可以看到,Python減少了”DEF”的引用計數并且立即回收了”DEF”對象。同時(shí)可以看到,由于n1和n2同時(shí)指了”JKL”對象,所以它的引用計數變?yōu)榱?。

標記回收算法

最終臟亂的房間將堆慢垃圾,生活不能總是如此。Ruby程序在運行一段時(shí)間之后,空閑對象鏈表最終將被用盡。

mark-fthrthand-sweep1

上圖中所有的預分配對象都被用盡(方塊全部變成了灰色),鏈表上沒(méi)有對象可用(沒(méi)有剩余的白色方塊)。

此時(shí),Ruby使用了一種由約翰麥卡錫發(fā)明的被稱(chēng)為”標記回收”的算法。首先,Ruby將停止程序的執行,Ruby使用了”停止這個(gè)世界,然后回收垃圾”的方式。然后,Ruby會(huì )掃描所有的指向對象和值的指針或引用。同樣,Ruby也會(huì )迭代虛擬機內部使用的指針。它會(huì )標記每一個(gè)指針所能到達的對象。在下圖中,我使用了”M”指出了這些標記:



關(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>