面试题答案
一键面试Ruby垃圾回收机制基本工作原理
- 对象可达性分析:Ruby 的垃圾回收机制基于对象的可达性来判断对象是否不再使用。它从一组“根对象”开始,如全局变量、局部变量等。从这些根对象出发,通过指针关系可以遍历到的对象被认为是“可达的”,而无法从根对象遍历到的对象则被认为是“不可达的”,即不再使用,可以被回收。
- 标记 - 清除算法:这是 Ruby 早期使用的主要垃圾回收算法。
- 标记阶段:垃圾回收器从根对象开始,递归地标记所有可达对象。
- 清除阶段:标记完成后,垃圾回收器会遍历堆内存,回收所有未被标记的对象(即不可达对象)所占用的内存空间。
- 分代垃圾回收:为了提高垃圾回收效率,Ruby 引入了分代垃圾回收机制。
- 对象代的划分:新创建的对象被分配到年轻代(Young Generation)。当对象经过一定次数的垃圾回收周期后仍然存活,就会被移动到年老代(Old Generation)。
- 不同代的回收策略:年轻代中的对象生命周期通常较短,垃圾回收频率较高,采用复制算法。即把年轻代中存活的对象复制到另一个空间,然后清空原年轻代空间。年老代中的对象存活时间长,垃圾回收频率较低,采用标记 - 清除或标记 - 整理算法。标记 - 整理算法在标记完存活对象后,会将存活对象移动到内存一端,然后清理边界以外的内存空间,减少内存碎片。
- 写屏障(Write Barrier):在对象引用关系发生变化时,写屏障用于确保垃圾回收器能够正确追踪对象的可达性。当一个对象的引用关系被修改时,写屏障会记录这个变化,使得垃圾回收器能够及时更新对象的可达状态,避免误判对象为不可达而提前回收。