ruby的記憶體管理

來源:互聯網
上載者:User

標籤:

ruby的垃圾收集器

在ruby中,做的所有的事幾乎都需要記憶體。

ruby垃圾收集器的工作就是管理記憶體,並最終釋放那些不再使用的對象。但是這會犧牲一點效能,它工作的時候需要暫停人的程式。

它是如何工作的?

它使用一種被稱為標記-清除(mark and sweep)的過程。首先,遍曆對象圖,能被訪問到的對象會被標記為存活的。接著,任何未在第一階區段標記過的對象會被視為垃圾並清楚, 之後將記憶體釋放回ruby或作業系統。並且遍曆整個對象圖並標記可訪問對象的開銷很大。

ruby2.1通過新的分代式垃圾收集器對效能進行了最佳化。對象分為兩類,年輕代和年老代。這有一個前提:大多數對象的存留時間都不會很長。對於存活時間長的對象,比如常量,垃圾收集器可以最佳化標記,自動的將這些老的對象標記為可訪問,而不需要遍曆整個對象圖。

如果年輕代對象在第一階段的標記中存活下來,那麼ruby的分代式垃圾收集器就把它們提升為年老代對象。也是說,在上次記憶體回收之後,它們依然是可訪問的。

標記階段可為分為兩種模式: 主要標記階段和次要標記階段。在主要標記階段中,所有的對象(不分新老)都會被標記,所以開銷很大。在次要標記階段,僅僅考慮年輕代對象,並自動標籤年老對象,而不檢查能否被訪問。這意味為年老代對象只會在主要標記階段過後才會被清除。垃圾收集器傾向於使用次要標記。

垃圾收集器的清除階段也分為兩種模式:即時模式和懶惰模式。在即時模式中,垃圾收集器會清除所有的未標記的對象。如果有很多個物件需要釋放時,這個模式開銷很大。懶惰模式會嘗試釋放儘可能少的對象,當ruby建立一個新的對象,它會嘗試觸發一次懶惰清除階段,去釋放一些空間。

ruby從作業系統的自由儲存區申請記憶體的開銷可能很大,通常它會在分配內在時多分配一些冗餘記憶體,並維護一個記憶體池,只有記憶體池被分配完之後才會向作業系統申請額外的記憶體。

 

ruby的記憶體管理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.