首页 > 代码库 > ruby的内存管理

ruby的内存管理

ruby的垃圾收集器

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

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

它是如何工作的?

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

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

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

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

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

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

 

ruby的内存管理