MST
星途 面试题库

面试题:Ruby内存管理机制中的垃圾回收机制是如何工作的?

在Ruby中,垃圾回收(GC)机制用于回收不再使用的内存。请详细阐述Ruby垃圾回收机制的基本工作原理,包括它如何检测不再使用的对象,以及采用了哪些算法来进行垃圾回收?
24.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

Ruby垃圾回收机制基本工作原理

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