Ruby 2.1 正式版已经发布,带来了很多预期的改进,其中包括对垃圾收集器的大幅改动,这一改进将在现在和未来带来一些性能提升。
Ruby 2.1 中的垃圾收集器实现了一种分代垃圾收集形式,Ruby 把它的这种实现称为“RGenGC(Restricted Generational Garbage Collection)”。它替换了 Ruby 之前版本中采用的“Mark & Sweep(标记与清除)”实现。Ruby 开发者 Koichi Sasada 在 2013 年 4 月的一次演讲中提到,对 Ruby 开发者而言,挑战在于实现一个可以在同一堆内处理保护对象和非安全对象的 GC 算法。
因为重写所有现有的 C 扩展以利用新的 GC 并不现实,所以作为实现的一部分,RGenGC 实现中使用了写屏障(Write-Barrier)。就像 Sasada 在 RubyConf 2013 的演进( PDF )中所解释的那样,最初的两种选择是:A) 根本不实现分代垃圾收集(与 Ruby 2.0 和之前版本中的做法一样),或 B) 实现分代垃圾收集,同时需要重写所有 C 扩展。RGenGC 在这两种选择之外提供了第三种方式。
RGenGC 与现有扩展高度兼容,同时仍然带来了性能提升。常用的 Array、String、Hash、Object 和 Numeric 等对象都有写屏障保护,因此能够利用 RGenGC 系统。未来在内部库和外部库上的工作也为以后进一步改进性能带来了可能性。
新的垃圾收集系统不是唯一的改进,其他改进包括 RDoc 4.1.0、RubyGems 2.2.0 以及一些库的更新。完整的改进列表请参见该项目 GitHub 页面的发布说明。
评论