写点什么

Ruby 2.2.0 发布,支持增量式垃圾收集和符号的垃圾收集

  • 2015-01-06
  • 本文字数:1659 字

    阅读完需:约 5 分钟

Ruby 2.2.0 已于 2014 年 12 月 25 日发布,这是给Ruby 开发者的圣诞礼物。该版本的亮点包括一些垃圾收集方面的改进:引入了一个新的增量式垃圾收集算法,支持对符号(Symbol)进行垃圾收集。核心类和标准库方面也有小幅改进。

根据 Ruby 2.1.0 中分代垃圾收集(RGenGC)相关的说明,分代方式可以改进 GC 吞吐量。在新版本中,Ruby 的维护者继续引入了重要的改进。大部分对象都会在很年轻的时候死掉,根据这个假设,分代垃圾收集将对象分为几个代。这个假设使得对较年轻对象的处理有较高的吞吐量和较低的延迟,因为较老的对象会在内存不足时才去计算是否要删除。不过也意味着,较老的对象仍然要承受高延迟之困。

增量式垃圾收集(RIncGC)是在分代垃圾收集的基础上构建的,致力于在维持同样吞吐量的前提下减少停顿时间。通过将标记阶段(把对象标记为可以进行垃圾收集)与 Ruby 的正常执行交错进行,较少了停顿时间。而在 Ruby 2.2.0 之前,标记阶段要占用很大的一步。

RGenGC 和 RIncGC 都不能管理所有对象,意味着某些对象不会被提升到较老的一代。主要是因为 C 扩展,无法保证全部满足 RGenGC 和 RIncGC 的约束。在 RubyConf 2014 大会上, Koichi Sasada 详细描述了RGenGC 和RIncGC 。如果想了解所有的算法细节和性能基准测试,这是很好的材料。

全局停顿__GC__ 与增量式__GC 之对比 来源: Koichi Sasada

RIncGC__ 消除了长期停顿 来源: Koichi Sasada

Ruby 2.2.0 引入的对符号的垃圾收集,也改进了 Ruby 的内存管理。这个改进如此之大,乃至计划于 2015 年秋季发布的 Ruby on Rails 5.0 ,将仅支持 Ruby 2.2 及以上的版本。

Rails 5.0 将仅支持 Ruby 2.2 及以上的版本。Ruby 2.2 带来的很多优化都非常棒,但是对 Rails 而言,符号的垃圾收集是最重要的。这意味着在处理来自外部的字符串时,可以轻松很多。而且我们可以完全转换到最新的 Ruby 带来的关键字参数(keyword arguments)和其他所有良好特性。

因为 Ruby 内部会将每个符号映射到一个整形数(integer),带来了一个问题。CRuby(用 C 实现的 Ruby)将这个整形数用作符号的 ID。如果一个符号在 Ruby 端释放了,之后又创建了同样的字符串,那会出现不同的 CRuby 整形数 ID。这意味着,根据语言规范是同样的符号,但是出现了不同的 ID,所以是个 bug。

最简单的解决方案是用字符串替换 CRuby 中的整形数,这样在两端(C 和 Ruby)就一致了。另外,C 扩展将问题变得更复杂了,因为它们会妨碍运行时探测和管理所有的符号。解决方案是将符号分成两组:永久的(immortal)和非永久的(mortal)。永久的符号会继续使用整形数 ID,不会被回收。这类例子包括方法名、变量名、常量和其他语言元素。非永久的符号,比如"foo".to_sym,没有整形数 ID,可以被回收。

非永久的符号与永久的符号之对比 来源: Narihiro Nakamura

Narihiro Nakamura 在 RubyKaigi2014 大会上描述了符号GC 的解决方案,还介绍之所以使用这种方案的所有约束条件。

仍然是内存管理方面,Ruby 2.2.0 还提供了一个选择,即使用 jemalloc 代替系统的 malloc,此举有可能会提高速度,并减少内存碎片。这还是一个实验性特性,在收集到更多性能数据和使用案例后才会正式提供。

诸如 system() 和 spawn() 等创建进程的方法,在可能的情况下会使用 vfork(2) ,代替了 fork()。这种改变也会提高性能,尤其是当父进程会消耗大量内存时。这也是个实验性特性,未来可能会发生变化。

核心库现已支持Unicode 7.0 ,还引入了一些新方法,如 Enumerable#slice_after Enumerable#slice_when Float#next_float、Float#prev_float File.birthtime、File#birthtime String#unicode_normalize

Ruby 2.2.0 废弃了 mathn 库,同时还更新了其他一些库:

  • Psych 2.0.8
  • Rake 10.4.2
  • RDoc 4.2.0
  • RubyGems 2.4.5
  • test-unit 3.0.8
  • minitest 5.4.3

更多细节,包括废弃的一些 C API 以及一些非兼容的改变,详见 Ruby 2.2.0 相关新闻。与 Ruby 2.1.0 相比,Ruby 2.2.0 有 1557 处文件改动,包括 125039 条插入和 74376 条删除。

查看英文原文: Ruby 2.2.0 Released, Featuring Incremental and Symbol GC

2015-01-06 08:381630
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 130.0 次阅读, 收获喜欢 34 次。

关注

评论

发布
暂无评论
发现更多内容

自定义View:ViewGroup与View的事件传递

Changing Lin

11月日更

盲盒app开发小程序源码定制

盲盒app开发源码搭建小程序app

盲盒开发盲盒系统开发定制

盲盒开发盲盒源码搭建系统开发

ABAP 和 Java 的单元测试 Unit Test

Jerry Wang

Java abap 11月日更 JavaSAP

987页的Java面试宝典,看完才发现,应届生求职也没那么难

热爱java的分享家

Java 架构 面试 程序人生 编程语言

关于openGauss账本数据库:你想知道的这里都有

openGauss

华为云GaussDB NoSQL云原生多模数据库的超融合实践

华为云数据库小助手

GaussDB 华为云数据库 GaussDB NoSQL

为何飞书成了先进企业的标配?

ToB行业头条

使用 Node.js 消费SAP Cloud for Customer上的Web service

Jerry Wang

node.js SAP C4C 11月日更

Android C++系列:Linux文件IO操作(二)

轻口味

c++ android jni 11月日更

从0到10彻底搞懂信息流【投放系统】

水泽山林

系统架构 推荐系统 智能投放 内容平台

盲盒app开发盲盒小程序开发

解决文件存储难题 openGauss隆重推出段页式特性

openGauss

Hadoop实战篇-集群版(2)

进击的梦清

大数据 hadoop zookeeper

盲盒开发蛋趣芒趣一番赏源码搭建

一网打尽!音乐高手都在使用的打谱软件不藏私推荐!

懒得勤快

SOLID原则之 单一职责原则

面向对象的猫

SOLID

“太白”团队加入OpenInfra Labs,联合社区成员共同完善多云管理技术

我就获取个时间,机器就down了

安第斯智能云

Linux 后端

dart系列之:元世界pubspec.yaml文件详解

程序那些事

flutter dart 程序那些事 11月日更

如何用EasyRecovery恢复中毒U盘中丢失的文件

淋雨

EasyRecovery

CSS奇技淫巧之滤镜(二)drop-shadow

Augus

CSS 11月日更

45岁程序员发求职贴:精通各种技术体系,却连个面试机会都没有…

Java高级开发

Java 程序员 面试 职场

Ustore在openGauss闪亮登场,重构openGauss数据存储的灵魂

openGauss

Python代码阅读(第59篇):根据value查询字典key值

Felix

Python 编程 阅读代码 字典 Python初学者

盲盒一番赏APP开发源码搭建

盲盒开发盲盒小程序源码搭建app

这个无敌设计,可以解析并运算任意数学表达式

Tom弹架构

Java 架构 设计模式

AI界的革命!终于可以自动标注了!

百度开发者中心

AI 自动标注工具

Ruby 2.2.0发布,支持增量式垃圾收集和符号的垃圾收集_Ruby_João Miranda_InfoQ精选文章