24、MRI垃圾回收机制详解

MRI垃圾回收机制详解

1. 垃圾回收基础概念

在程序运行过程中,会不断创建新对象。当MRI(Matz’s Ruby Interpreter)把空闲列表(free list)中的所有剩余对象都用完时,垃圾回收(GC)系统会暂停程序,识别出代码不再使用的对象,并回收它们的内存,以便分配给新对象。若未找到未使用的对象,Ruby会向操作系统请求更多内存;若没有可用内存,Ruby会抛出内存不足异常并停止运行。

那些程序分配但不再使用的对象被称为垃圾对象。为了识别这些垃圾对象,MRI会遍历对象C结构中的指针,从一个对象的引用追踪到另一个对象,以此找出所有活跃对象。

2. 标记过程(Marking)
  • 标记活跃对象 :MRI通过一种名为位图标记(bitmap marking)的技术来保存已标记和未标记对象的信息。具体来说,它将活跃对象的标记以一系列位的形式保存在一个名为空闲位图(free bitmap)的数据结构中。MRI使用单独的内存结构来存储空闲位图,而不是将标记信息保存在对象附近。
  • 标记的原因 :使用单独的内存结构存储标记位与Unix的写时复制(copy-on-write)内存优化技术有关。写时复制允许Unix进程共享包含相同值的内存。通过单独保存标记位,MRI可以最大化跨进程中包含相同值的内存量。在Ruby 1.9及更早版本中,标记位保存在每个RVALUE结构内部,这导致垃圾回收器在标记活跃对象时几乎会修改Ruby的所有共享内存,使得写时复制优化失效。
3. 清扫过程(Sweeping)

识别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值