NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:381635
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

OpenFaas 获得 VMworld 2020 年度最佳 Startup Spotlight 大奖

donghui

Serverless OpenFaas

摆脱复杂烧脑的程序代码,利用快速开发平台轻轻松松做软件

Marilyn

敏捷开发 快速开发

标本兼治,程序员用它整体提升公司效率

Marilyn

敏捷开发 快速开发

为了省钱,我用1天时间把PHP学完,装进DDD领域驱动设计里!

小傅哥

php 设计模式 小傅哥 架构师

架构师训练营第 1 期 第 4 周作业

李循律

极客大学架构师训练营

TensorFlow 篇 | TensorFlow 2.x 基于 Keras 的模型保存及重建

Alex

tensorflow keras model save model restore tensorflow hub

MySQL 建表为啥还设置个自增 id ?用流水号当主键不正好么?

程序员小航

Java MySQL 开发 工作笔记 流水号

XJR企业级软件快速开发平台规范

Marilyn

程序员 敏捷开发 软件设计

为什么巨头都在布局SaaS生态?

ToB行业头条

SASS

java安全编码指南之:输入注入injection

程序那些事

Java java安全编码 java安全 java安全编码指南

架构一期第四周作业

Airs

智能时代,快速开发平台将成为主流软件开发工具

Marilyn

敏捷开发

JAVA & VUE ,分离式开发平台建造思路

Marilyn

Java Vue 敏捷开发

Go发起HTTP2.0请求流程分析(前篇)

Gopher指北

HTTP HTTP2.0 Go 语言

商业智能(Business Intelligence)系统的使用及设计原则

Marilyn

敏捷开发 快速开发 商业智能

spring-boot-route(十三)整合RabbitMQ

Java旅途

Java Spring Boot RabbitMQ

大企内部软件系统反复故障难以解决,业内人士:唯有彻底更换

Marilyn

敏捷开发 快速开发 开发工具

低代码开发平台,来自“未来”的软件开发方案

Marilyn

敏捷开发

深入分析软件快速开发平台与传统软件开发方案的优缺点

Marilyn

敏捷开发

GitHub 上开源了一个很邪恶的项目!女生勿近,18香警告...

程序员生活志

Redis Sharding集群跟一致性哈希有什么瓜葛?

Man

一致性哈希 Jedis redis cluster

Kubeless 快速入门 | 玩转 Kubeless

donghui

Serverless kubeless

JAVA代码生成器,快速开发平台之魂

Marilyn

Java 敏捷开发 快速开发 开发工具

快速开发平台,程序员“老师傅”必备

Marilyn

敏捷开发 快速开发 开发工具

快速开发平台,高集成易扩展,进入软件疾速开发新世代

Marilyn

敏捷开发 快速开发 开发工具

用友政务表格技术应用开发实践:预算一体化产品核心功能搭建

葡萄城技术团队

SpreadJS 用友

MySQL-技术专题-性能优化—索引篇

洛神灬殇

游戏夜读 | 怎么做联网五子棋?

game1night

Vidyo的解决方案到底是什么?有哪些特点?

dwqcmo

音视频 集成架构 解决方案 智能硬件

有一说一,大型信息化企业的软件系统,还是用自研的好

Marilyn

敏捷开发 快速开发 开发工具 软件设计

架构师训练营 1 期第 4 周:系统架构 - 作业

piercebn

极客大学架构师训练营

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