Ruby 垃圾回收机制深度解析
1. 垃圾回收基础问题与三色标记法
垃圾回收器在标记所有存活对象时,可能会遗漏新对象。当回收器回收这些被遗漏对象的内存时,应用程序可能会丢失有效数据,或者在某个对象中添加无用数据。为了解决这个问题,引入了三色标记法。
三色标记法的核心是维护一个标记栈(mark stack),初始时所有根对象都会被放入标记栈。垃圾回收器在标记对象时,会将对象从标记栈移动到已标记对象列表中,并将找到的子对象添加到标记栈。当标记栈为空时,垃圾回收器完成标记,剩余未标记的对象被视为垃圾。
如果在标记过程中应用程序修改了某个对象,即使该对象之前已被标记,回收器也会将其移回标记栈。这种标记算法将对象分为三种颜色:已处理的对象为“黑色”,标记栈中的对象为“灰色”,其余对象为“白色”。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([开始]):::startend --> B(将根对象放入标记栈):::process
B --> C{标记栈是否为空}:::process
C -- 否 --> D(从标记栈取出对象标记为黑色):::process
D --> E(将子对象添加到标记栈):::process
E --> F(检查对象是否被修改):::process
F -- 是 --&g
超级会员免费看
订阅专栏 解锁全文
31

被折叠的 条评论
为什么被折叠?



