新聞中心

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

        對比Ruby和Python的垃圾回收

        作者: 時間:2016-09-12 來源:網絡 收藏
        mark-and-swfbdfdfbeep2

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

        mark-anfdgdgdgd-sweep3

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

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

        mafdbdffdbrk-and-sweep4

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

        gfhghfghtrhtrhjjrt-sweet5

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

        現在,當我們要創建一個新的Ruby對象的時候,Ruby將為我們返回收集的垃圾對象。在Ruby中,對象是可以重生的,享受著多次的生命!

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

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

        然而,引用計數實現起來不會像它看起來那樣簡單。這里有一些許多語言不愿像一樣使用引用計數算法的原因:

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

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

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

        下一次…

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


        上一頁 1 2 3 下一頁

        關鍵詞: Ruby Python 垃圾回收

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 五原县| 囊谦县| 抚远县| 郴州市| 天等县| 常州市| 清新县| 白河县| 伊金霍洛旗| 朝阳县| 确山县| 成都市| 合水县| 桃园县| 饶阳县| 绥化市| 达拉特旗| 扶余县| 于田县| 新化县| 花垣县| 绍兴市| 东乡族自治县| 白银市| 凯里市| 南城县| 山西省| 保靖县| 稷山县| 潮州市| 读书| 泗水县| 伊宁市| 延吉市| 津市市| 白朗县| 木里| 元江| 浑源县| 饶阳县| 北京市|