垃圾回收算法|GC标记-清除算法

本文是《垃圾回收的算法与实现》读书笔记

640?wx_fmt=jpeg

什么是GC标记-清除算法(Mark Sweep GC)

GC 标记-清除算法由标记阶段清除阶段构成。在标记阶段会把所有的活动对象都做上标记,然后在清除阶段会把没有标记的对象,也就是非活动对象回收。

名词解释:

在 GC 的世界里对象指的是通过应用程序利用的数据的集合。是 GC 的基本单位。一般由头(header)和域(field)构成。

活动对象:能通过引用程序引用的对象就被称为活动对象。(可以直接或间接从全局变量空间中引出的对象)

非活动对象:不能通过程序引用的对象呗称为非活动对象。(这就是被清除的目标)

标记-清除算法的伪代码如下所示:

func mark_sweep(){
   
mark_phase() // 标记阶段
sweep_phase() // 清除阶段
}

标记阶段

标记阶段就是遍历对象并标记的处理过程。

标记阶段伪代码如下:

func mark_phase(){
   
for (r : $roots) // 在标记阶段,会给所有的活动对象打上标记
mark(*r)
}

func mark(){
if (obj.mark == False)
obj.mark = True // 先标记找出的活动对象
for (child: children(obj)) // 然后递归的标记通过指针数组能访问到的对象
mark(*child)
}

这里 $root是指针对象的起点,通过$root 可以遍历全部活动对象。

下图是标记前和标记后内存中堆的状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值