当前位置: 首页 > news >正文

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

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。如果想了解所有的算法细节和性能基准测试,这是很好的材料。

\\

c02c8e3c00efd3772aa0adda82ef08fd.png

\\

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

\\

d166b101d8fc6a9bb751e25407b7eb54.png

\\

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,可以被回收。

\\

cf5b06bdb51642d34783dd9f471140b9.png

\\

非永久的符号与永久的符号之对比 来源: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\\t
  • Rake 10.4.2\\t
  • RDoc 4.2.0\\t
  • RubyGems 2.4.5\\t
  • test-unit 3.0.8\\t
  • 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

相关文章:

  • 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇...
  • 仿小米便签图文混排 EditText解决尾部插入文字bug
  • 前端展示用部分CSS
  • 解剖SQLSERVER 第三篇 数据类型的实现(译)
  • DB2数据库用 With语句分隔字符
  • 处理和引发事件的规范
  • 图像的边缘提取
  • Linux之shell编程基础
  • 測试之路2——对照XML文件1
  • 魅族 连接 mac 调试
  • PhotoSwipe - 移动开发必备的 iOS 风格相册
  • https://github.com/cykl/infoqscraper/
  • 数据结构实验之栈四:括号匹配
  • django 安装/部署过程
  • 使用expdp的心得
  • Github访问慢解决办法
  • NSTimer学习笔记
  • Service Worker
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 初识MongoDB分片
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 如何解决微信端直接跳WAP端
  • 微信小程序--------语音识别(前端自己也能玩)
  • 移动端 h5开发相关内容总结(三)
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​香农与信息论三大定律
  • #define、const、typedef的差别
  • (1)(1.9) MSP (version 4.2)
  • (31)对象的克隆
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)VC++中ondraw在什么时候调用的
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net(C#)中String.Format如何使用
  • .NET企业级应用架构设计系列之技术选型
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /proc/stat文件详解(翻译)
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [.net]官方水晶报表的使用以演示下载
  • []串口通信 零星笔记
  • [2544]最短路 (两种算法)(HDU)
  • [Android学习笔记]ScrollView的使用
  • [Angular 基础] - 表单:响应式表单
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C#]winform部署PaddleOCRV3推理模型
  • [C/C++]数据结构 循环队列
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [Codeforces] probabilities (R1600) Part.1
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c