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

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实现方式存在根本缺陷,并建议,一旦JRuby和Rubinius实现了与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

你可能感兴趣的:(Ruby 2.1迁到分代式垃圾收集,以应对其在大规模部署方面所遭受的批评)