Ruby 2.1 迁到分代式垃圾收集,以应对其在大规模部署方面所遭受的批评

  • Manuel Pais
  • 马德奎

2013 年 9 月 20 日

话题:RubyRuby on RailsGitHub语言 & 开发

Ruby的创建者Matz于上周末在Baruco(Barcelona Ruby 会议)上宣布,Ruby MRI 2.1 将迁到分代式垃圾收集(GC),此举有望成为这门语言的一项重要性能提升。Ruby 2.1 预计在今年年底前发布。

巧合的是,在当天的另一场演讲中,Github 的Vicent Marti强烈地批评了 Ruby MRI 的垃圾收集实现方式,将当前的标记 & 清除算法称为“双头怪兽”。Vicent 阐述了 Ruby GC 的局限性如何经常影响 Github 这样一个大规模的 Ruby 部署。

一方面是由于标记阶段缓慢(这一阶段实际上会停止应用程序,并顺序遍历整个对象图以确定活动对象)。另一方面是由于清除阶段不准确,它可能最终清除实际上仍在使用的 C 扩展(或 C 扩展指向的)Ruby 对象。

Vicent 提到,使用诸如Valgrind这样的工具或者预先执行静态分析有助于减少此类问题,但他也强调,Ruby MRI 目前的 GC 实现方式存在根本缺陷,并建议,一旦JRubyRubinius实现了与 MRI 同样的功能集,就将大规模的 Ruby 部署向 JRuby 或 Rubinius 迁移。

在 Ruby 目前的 GC 实现方式速度慢这一点上,New Relic 的Chris Kelly演讲中表达了同样的观点,并强调,一个典型的 Rails 应用程序启动时会加载成千上万的对象,而 GC 执行的标记阶段需要对这些对象进行一遍又一遍地分析。不过,Chris 也与大家分享了New Relic 的 Ruby GC 基本问题测试结果,在 Ruby 1.8 和 1.9 之间,执行垃圾收集的时间减少了 48%。

据 Chris 说,这表明 MRI 团队正在进行重大改进以升级 Ruby 在这方面的实现方式,尤其是宣布迁到分代式垃圾收集(据 Matz 说,此举有望将标记阶段耗时减少一半)。

在有些演讲中还有一些批评是关于缺少 Ruby MRI 垃圾收集实现方式方面的英文文档,而 Chris 在其演示文稿中列出了一些推荐内容,如“罕见的 GC 探讨”。

Matz 还宣布了 Ruby 2.1 的其它一些功能增强,包括字符前缀(“i”表示 complex 数字、“r”表示 rational 数字、“f”代表 frozen 字符串)、refinements(全功能)和更快(大约 15%)的RDoc文档生成速度。

查看英文原文:Ruby 2.1 Garbage Collection to Address Criticism on Large Scale Deployments

RubyRuby on RailsGitHub语言 & 开发