ruby GC

作者: SecondRocker | 来源:发表于2016-01-04 00:26 被阅读241次

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

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

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

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

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

相关文章

  • ruby GC

    主要的GC算法包括:标记清除方式、复制收集方式、引用计数方式。 标记清除:顺序遍历整个对象图,对可能被引用的对象用...

  • Ruby GC自述

    众所周知,Ruby(MRI)中有三大神秘区域: GC GIL 编译/执行 我就是CRuby的GC,虽然大多数人不了...

  • python和ruby的GC

    Python垃圾回收机制--完美讲解!

  • JVM垃圾收集器

    GC的时机 GC从时机上分为两种:Scavenge GC和Full GC Scavenge GC(Minor GC...

  • java常见垃圾收集器

    常见的有Serial GC、ParNew GC、CMS GC、Parallel GC、G1 GC Serial G...

  • FullGC、MinorGC、STW等常见问题如何解答

    什么是Full GC?minor GC? major GC? STW? minor GC:新生代回收的gc( ST...

  • 内存分配与回收策略

    1 Minor GC+Major GC+Full GC (1)Minor GC:新生代GC。因为Java对象大多都...

  • Go GC

    1、什么是GC?2、为什么会有GC?3、GC的优点?4、GC的缺点?5、Go中的GC历史6、Go中的GC实现原理(...

  • 通过 gc.log 调优 JVM

    一、GC 日志查看 GC 日志默认是关闭的,需要查看 GC 日志首先需要开启 GC 日志。 常用 GC 日志的配置...

  • 王一三学习笔记 | 理解Java垃圾回收

    Serial GC、Parallel GC、Parallel Old GC(Parallel Compacting...

网友评论

      本文标题:ruby GC

      本文链接:https://www.haomeiwen.com/subject/hidohttx.html