GC——清除阶段


前面我们有说到垃圾回收包含两个阶段:标记阶段和清除阶段.这次我们直接来说第二个阶段——清除阶段.
在清除阶段中有三种算法比较常见:标记清除算法(Mark-Sweep),复制算法(Copying)以及标记压缩算法(Mark-Compact).接下来一一来谈一谈.

标记清除算法

还是老样子,先了解标记清除算法识什么或者说它的执行过程是怎么个流程.当堆中的有效内存空间被耗尽的时候,就会停止整个程序(STW),然后进行两项工作,标记和清除.
标记:Collector从引用根节点开始遍历,标记所有被引用的对象.(一般是在对象的Header中记录为可达对象)
清除:Collector对堆内存从头到尾进行线性遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其收回.
那么它有啥优点及缺点呢?

优点

简单明了,正常情况下大家都会首先想到这个办法,类似于暴力搜索.

缺点

首先,一次又一次的遍历效率不算高.其次,在GC的时候,需要停止用户线程,用户体验差.最严重的一点还是清理出来的空闲内存是不连续的,产生内存碎片,需要维护一个空闲列表.我们根据以下的图来谈谈第三点
在这里插入图片描述
当我们产生一个新的大对象的时候,而内存不足时,这时候就需要JVM进行GC了,GC也成功的把垃圾对象进行了回收,我们剩余内存空间也确实变大了,但是由于空闲内存空间不连续,没有哪块空间存放的下当前这个大对象.于是还是报了OOM.这变相的说明了此算法空间利用率不太行.

复制算法

为了解决标记清除算法在垃圾收集效率方面的缺陷,复制算法闪亮登场!!!它又是怎么个工作流程呢?

核心思想:将活着的内存空间分为两块,每次只使用到其中一块,在GC时将正在使用内存中的存活对象复制到未被使用的内存块之中,之后清除正在使用内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收.

是不是有的朋友看完之后,就忽然发现这玩意咋越听越熟悉呢,这不就是新生代中的from区和to区使用的算法嘛!(幸存者1区和幸存者2区)没错,复制算法因为其特点,正好适用于新生代进行GC,后续会讲为什么.

那么复制算法的优点和缺点又有哪些呢?

优点

1.它没有标记过程,实现简单,运行高效.
2. 复制过去后会保证空间的连续性,不会出现"碎片"问题.如图:
在这里插入图片描述

缺点

1.想必大家也看出来了,始终需要一个内存块未被使用.
2.对于G1(默认的垃圾回收器)这种分拆成为大量的region的GC,复制而不是移动,意味着GC需要维护region之间对象引用关系,无论从内存还是时间方面来看,开销也是不小的.

补充

为什么说复制算法适用于新生代中呢?我们来看一个比较极端的例子:当目前被使用的内存块中全是存活对象或者说大多都是存活对象,那么几乎是将全部对象给复制了一遍到未被使用的内存块中,这岂不是既费力气又没做什么事.而我们新生代中的对象可以用一个词来形容"朝生夕死",就是来的快走的也快.所以,那些真正能够存活的对象是比较少的,这不正是复制算法所期盼的嘛,我只需要复制少量存活对象,其余的全部干掉!

标记压缩算法(标记整理)

基于前面所说的复制算法问题,老年代中的对象几乎都存活挺久的.因此,需要新的解决方式:标记压缩算法.
什么又是标记压缩算法呢?从名字上可以得知,它也分为两部分:标记和压缩.标记和标记清除算法中的标记是一样的,这里就不在做解释.压缩:根据一定的算法将所有的存活对象压缩到内存的一端,按顺序存放.如图:
在这里插入图片描述
之后便清理不再需要的对象.

可以简单的理解为标记整理算法就是在标记清除算法的基础上进行了一次内存碎片的整理.标记清除算法是非移动式的回收算法.标记整理算法是移动式的回收算法.它解决了前面两种算法的缺点,可并不代表它就完美了.

优点

1.解决了内存碎片问题(标记清除算法)
2.解决了始终需要一个空闲内存块问题.(复制算法)

缺点

1.从效率上来说,它比前二者都低.(相对于标记清除算法多了整理环节,相对于复制算法又多了标记环节)
2.整理碎片的时候(移动对象使它们存放连续),需要改变对象的地址,若对象还被其它对象引用,则需要改变的不仅仅是栈中的引用地址,还需改变其它对象中的引用地址.
3.移动过程中,也是需要暂停用户应用程序的,即STW(Stop The World)

三者对比

在这里插入图片描述

Tips

对比下来,发现几乎没有最优的算法,难道真的没有嘛?留个小悬念哈哈哈哈
若有写错,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值