垃圾回收机制的算法实现——标记删除算法

一、标记删除算法

标记删除算法算是垃圾回收里非常成熟的一种算法。它不但应用时间长,而且还衍生了不少的相关算法,说它是垃圾回收里的老大哥,一点儿也不为过。标记删除算法一般分为两个阶段,即算法标记阶段和删除阶段。标记阶段意味着把所有的有应用的和待定的内存对象标记上特定的标记;而删除阶段则把所有没有标记的内存对象全部回收。
说起来容易,但实现起来,却有各种各样的问题,这也是标记删除算法有很多衍生版本的原因。举一个例子,在搜索标记对象时,是广度优先还是深度优先还是两者结合还是有更好的方法?还是在不同的场景下使用不同的算法?这些问题,都在某种程度上决定着标记删除算法的优劣表现。

二、优缺点

标记删除算法作为最早应用的GC算法,优点非常突出:
1、算法简单容易实现
简单是王道,说别的都是开玩笑。相信生活常识也验证了这个道理,为简单付出点代价,很多人都会接受,比如,不做饭,订外卖。
2、比较容易与其它算法兼容
这句话的意思就是这个算法更容易和其它算法一起搞定一些复杂的GC回收场景。换句话说,最合适的才是最好的,不会有一种算法包打天下。

缺点也比较突出:
1、容易产生内存碎片
这是不是好现象,内存碎片的增多,意味着内存可用性大幅降低。而一般来说,服务器经常是常年开着,如果产生内存碎片较多,是非常致命的。
2、速度慢,效率略低
因为需要不断的遍历空闲内存来判断内存可用状态,所以分配内存的速度就有点不好看。

三、基本应用

其实GC就是内存管理的一种机制,一般来说它分为以下几个步骤:
1、内存的分配
一般来说,内存会通过N个空闲链表来维护可用内存空间,所谓内存的分配,就是在这些链表中查找可用的大小相同的内存,找到即可。当然,不同的内存管理机制可能维护的链表的内容和大小不同,比如小内存的分配,大内存的分配和超大内存的分配。还有如果内存不够如何申请等,都需要一套规范的机制。
2、内存的标记
标记过程就是通过搜索算法,遍历内存中的所有对象,得到当前内存中所有的可用与不可用的状态。一般来说,管理过程会在内存对象的头部打上相关标记,当然在这个过程中,还要控制辅助内存的消耗,这也一个问题。
3、内存的回收
管理进程会从内存的根对象开始,遍历所有内存对象的状态,将未标记使用的内存对象删除后并回收。
4、碎片的整理
标记删除算法的碎片整理非常简单,它只能整理连续的内存空间中的碎片,将其整合在一起,这在实际情况中是比较少见的。需要注意的是,碎片的整理,是在内存的清除回收阶段完成的。

常用的几个算法有:BiBOP法、位图标记等算法,同时,为了提高效率可以在清除垃圾时,采用延迟清除的手段。当然,这也只是一种综合平衡的手段,它只是在GC时尽量缩短了最大暂停时间,并不一定带来性能的提升。

四、总结

一个算法,从产生到现在,仍然活跃在实际的工程实践中,不能不说,这个算法一定有优秀之处。这就和看人一样,不能光盯住别人的缺点,而忽视别人的优点。也正如某管理大师据说,没有无能的下属,只有愚蠢的领导。
标记删除算法正是如此。代码之前,了无秘密。多看别人的优秀的成果,不断的提高自己的水平,这就是程序员的宿命。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值