ruby GC

主要的GC算法包括:标记清除方式、复制收集方式、引用计数方式。

  • 标记清除:顺序遍历整个对象图,对可能被引用的对象用递归的方式进行标记,然后将没有标记到的对象作为垃圾进行回收。缺点是需要遍历整个对象图,影响性能。
  • 复制收集:会将从根开始被引用的对象复制到另外的空间中,然后,再将复制的对象所能够引用的对象用递归的方式不断复制下去。将所有没有死亡的对象复制到新的空间中,然后将旧的空间废弃掉,就可以将死亡对象所占用的空间一口气全部释放出来,而没有必要再次扫描每个对象。下次GC的时候,现在的新空间也就变成了将来的旧空间。
  • 引用计数:在每个对象中保存该对象的引用计数,当引用发生增减时对引用计数进行更新。引用计数的增减,一般发生在变量赋值、对象内容更新、函数结束(局部变量不再被引用)等时间点。当一个对象的额引用计数变为0时,则说明它将来不会再被引用,因此可以释放对应的内存空间。引用计数最大的缺点,就是无法释放循环引用的对象

对上面三种方法组合,可以出现一些高级的方法:

  • 分代回收:分代回收的基本思路,是利用了一般性程序所具备的性质,即大部分对象都会在短时间内成为垃圾,而经过了一定时间依然存活的对象往往用于偶较长的寿命。如果寿命长的对象跟容易存活下来,寿命短的对象则会被很快的废弃,那么到底怎样做才能让GC变得更加高效呢?如果对分配不久,诞生时间较短的“年轻”对象进行重点扫描,应该就可以更有效的回收大部分垃圾。在分代回收中,对象按照生成的时间进行分代,刚刚生成不久的年轻对象划为新生代,而存活了较长时间的对象则划为老生代。根据具体实现方式的不同,可能会划分更多的代。那么根据程序的一般性质,那么只要仅仅扫描新生代对象,就可以回收大部分废弃对象中的一部分。新版本的ruby已经引入了代的机制,据估计垃圾回收效率会有一倍的提升。
  • 增量回收:垃圾回收时影响程序正常运行,为了维持程序的实时性,不等到GC全部完成,而是将GC操作细分成多个部分逐一执行。由于增量回收的过程是分布渐进式的,可以将中断时间控制在一定长队之内。另一方面由于终端操作需要消耗一定的时间,GC所消耗的总时间就会相应的增加。新版本ruby也引入了增量回收的机制。

ruby GC设置可参考以下链接:http://tmm1.net/ruby21-rgengc

你可能感兴趣的:(ruby GC)