GC-垃圾回收算法

7.3. 垃圾回收算法

7.3.1. Mark Sweep标记清除

1)Mark Sweep算法的原理
Mark Sweep算法称为标记清除算法,原理上:将对象划分为三个类别-存活对象、未使用对象、可回收对象,标记清除算法就是将可回收对象清理掉。
在这里插入图片描述

2)实现过程
第一步,对所有区域进行第一遍扫描,利用root Searching垃圾定位算法找到所有不可回收的区域和可回收的区域。第二步,对所有区域进行第二遍扫描,将所有可回收的部分进行清理,完成清理工作。此外,所有空闲的区域,使用空闲列表进行管理。
在这里插入图片描述

3)优势与劣势
优势:算法相对简单;适用于存活对象比较多的情况,此时效率比较高。
劣势:两遍扫描,效率偏低;容易产生碎片。

7.3.2. Copying拷贝

1)Copying原理介绍
Copying算法称为拷贝算法。其原理是:将所有区域一分为二,其中一块区域只存储存活对象,每次将另外一块区域中的存活对象拷贝到该部分区域中,然后将另外一块区域直接清理掉。
在这里插入图片描述

2)实现过程
将所有区域一分为二,遍历扫描一遍半个区域,利用root Searching垃圾定位算法找到所有不可回收的区域,将这些不可回收的区域都拷贝复制到另外半个区域,随着拷贝操作指向这些区域的引用也随之发生改变,拷贝结束之后,将原半个区域清理掉。
在这里插入图片描述

3)优势与劣势
优势:只需要遍历一遍半个区域,效率高;没有碎片、适用于存活对象比较少的情况;
劣势:要拿出一半的空间,所以会有空间浪费;需要移动和复制对象及其对象引用;
4)使用的场景
Serial、Parallel垃圾回收器。

7.3.3. Mark Compact标记压缩

1)Mark Compact介绍
Mark Compact算法称为标记压缩。其基本原理是:将区域中所有存活对象都放置到某一位置区域,就会造成所有存活对象占用连续的空间,其他空间都是空闲空间、
在这里插入图片描述

2)实现过程
第一步,扫描一遍所有区域,利用root Searching垃圾定位算法找到所有不可回收的区域。第二步,再次扫描一遍所有区域,将所有不可回收区域全部迁移到前面,从区域头部开始从前往后排。
在这里插入图片描述

3)优势与劣势
优势:不会产生碎片;方便对象的分配;不会内存减半。
劣势:需要扫描两遍所有区域;需要移动所有存活对象,效率低。
4)使用场景
Srieal Old、Parrallel Old垃圾回收器, 更适用于注重于吞吐量或处理器资源较为稀缺的场景。

7.3.4. 三色标记

1)基本概念
三色标记中的三色是指白色、灰色、黑色,分别表示:白色表示未被标记的对象;灰色表示自身被标记,成员变量未被标记(指该对象包含的那些引用对象未被标记);黑色表示自身和成员变量均标记完成(对象本身和该对象包含的其他对象均标记完成)。
在这里插入图片描述

2)使用范围
G1垃圾回收算法采用三色标记。
3)三色标记中的漏标情况
在remark重新标注阶段之前,如灰色指向了白色,黑色指向灰色;但是在remark重新标注时,黑色指向了白色,灰色不再指向白色,那么会将白色对象当做没有新引用指向从而回收掉,因为黑色已经是检查结束的,不会再检查黑色到白色这条支路上引用,将白色对象当做没有引用而处理掉。
在这里插入图片描述

remark重新标注阶段之前
在这里插入图片描述

remark重新标注阶段后
漏标情况分析:造成的原因有两个,一是原有的旧链接被删除,二是有新的连接添加却检测不到。针对这两方面,提出两种解决方法:
方法一是incremental update—增量更新,关注引用的增加,将黑色重新标记为灰色,下次重新扫描属性。方法二是SATB(snapshot at the beginning)–关注引用的删除,将被删除的连接堆到GC的堆栈,保证能被GC检测到原有的连接。
ZGC垃圾回收器采用方法一。
G1垃圾回收器采用的方法二。因为SATB会配合RSet使用, SATB中存放的是灰色到白色(被删除的引用连接关系),而下次扫描拿这个引用时,由于有Rset的存在,不需要扫描整个堆去查找指向白色的引用(Rset中存放的就是各个对象之间的引用关系),故而效率比较高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值