码迷,mamicode.com
首页 > 其他好文 > 详细

ruby的内存管理

时间:2016-09-10 21:58:13      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

ruby的垃圾收集器

在ruby中,做的所有的事几乎都需要内存。

ruby垃圾收集器的工作就是管理内存,并最终释放那些不再使用的对象。但是这会牺牲一点性能,它工作的时候需要暂停人的程序。

它是如何工作的?

它使用一种被称为标记-清除(mark and sweep)的过程。首先,遍历对象图,能被访问到的对象会被标记为存活的。接着,任何未在第一阶段标记过的对象会被视为垃圾并清楚, 之后将内存释放回ruby或操作系统。并且遍历整个对象图并标记可访问对象的开销很大。

ruby2.1通过新的分代式垃圾收集器对性能进行了优化。对象分为两类,年轻代和年老代。这有一个前提:大多数对象的生存时间都不会很长。对于存活时间长的对象,比如常量,垃圾收集器可以优化标记,自动的将这些老的对象标记为可访问,而不需要遍历整个对象图。

如果年轻代对象在第一阶段的标记中存活下来,那么ruby的分代式垃圾收集器就把它们提升为年老代对象。也是说,在上次垃圾回收之后,它们依然是可访问的。

标记阶段可为分为两种模式: 主要标记阶段和次要标记阶段。在主要标记阶段中,所有的对象(不分新老)都会被标记,所以开销很大。在次要标记阶段,仅仅考虑年轻代对象,并自动标记年老对象,而不检查能否被访问。这意味为年老代对象只会在主要标记阶段过后才会被清除。垃圾收集器倾向于使用次要标记。

垃圾收集器的清除阶段也分为两种模式:即时模式和懒惰模式。在即时模式中,垃圾收集器会清除所有的未标记的对象。如果有很多对象需要释放时,这个模式开销很大。懒惰模式会尝试释放尽可能少的对象,当ruby创建一个新的对象,它会尝试触发一次懒惰清除阶段,去释放一些空间。

ruby从操作系统的自由存储区申请内存的开销可能很大,通常它会在分配内在时多分配一些冗余内存,并维护一个内存池,只有内存池被分配完之后才会向操作系统申请额外的内存。

 

ruby的内存管理

标签:

原文地址:http://www.cnblogs.com/limx/p/5860106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!