MRI、JRuby 和 Rubinius 中的垃圾回收机制解析
1. JRuby 和 Rubinius 的垃圾回收概述
JRuby 借助 Java 虚拟机(JVM)来实现 Ruby,因此它能够利用 JVM 成熟的垃圾回收(GC)系统来管理 Ruby 对象的内存。实际上,垃圾回收是使用 JVM 平台的主要优势之一,JVM 的垃圾回收器经过多年的优化已经相当成熟。
Rubinius 的 C++ 虚拟机同样配备了高效且复杂的垃圾回收器,它采用了一些与 JVM 相同的底层算法。选择 Rubinius 作为 Ruby 平台的好处之一就是其出色的垃圾回收系统。
JRuby 和 Rubinius 所使用的垃圾回收器与 MRI 的垃圾回收器在以下三个方面存在差异:
- 复制式垃圾回收 :不使用空闲列表,而是采用复制式垃圾回收算法为新对象分配内存,并回收垃圾对象的内存。
- 分代垃圾回收 :使用分代垃圾回收技术,对新旧 Ruby 对象进行不同的处理。
- 并发垃圾回收 :在应用程序代码运行的同时执行一些垃圾回收任务。
需要注意的是,尽管 JRuby 和 Rubinius 的垃圾回收系统与 MRI 的标记 - 清除垃圾回收器有很大不同,但 MRI 也开始引入一些相关的理念。例如,Ruby 2.1 的垃圾回收系统已经开始采用分代和并发垃圾回收技术。
2. 复制式垃圾回收
2.1 复制式垃圾回收的起源
1963 年,在 John McCarthy 构建第一个 Lisp 垃圾回