垃圾收集器

概述

垃圾收集器就是在扫描到此对象没有任何引用时候则会将该对象视为垃圾对象。

如何发现垃圾

1. 引用计数算法
在这里插入图片描述

引用计数算法是通过:在对象中添加一个引用计数器,每当有地方引用它的时候计数器值就加一;当引用失效时计数器值就减一。在该对象的计数器为零的时候则会被视为垃圾对象将其回收。
这个算法,虽然占用了一些额外的内存空间来进行计数,但是它的原理简单,判定效率也高,在大多情况下它都是一个不错的算法。但是在现在的Java虚拟机中并不会使用引用计数算法来管理内存,主要原因就是,必须要配合大量的处理才能保证正确地工作。比如普通的引用计数算法就很难解决对象之间相互循环引用的问题。

2. 根搜索算法
在这里插入图片描述
根搜索算法是当前主流的判定对象是否存活的算法。这个算法的基本思路就是通过一系列称为根对象作为起始节点,从这个结点开始根据引用关系向上搜索,如果某个对象没找到任何有根节点的引用那么就说明此对象是不能再被使用的。
其中图上对象实例5依赖于对象实例3,而对象实例3没有任何根对象引用那么这两个对象则是不能再被使用的对象。

如何进行对象清除

1. 标记 - 清除算法
在这里插入图片描述
如上图就能看出来这是一种最不可靠的垃圾收集算法。
该算法就如它名字一样,“标记”和“清除”。首先要标记所有需要回收的对象,在标记完成之后,统一回收掉所有被标记的对象。也可以反过来,标记存活的对象,统一收回未被标记的对象。
该算法的主要两个缺点就是:
第一个是执行效率不稳定,如果堆中包含大量对象,而且其中大部分都是需要被回收的对象,那么这个时候就必须进行大量的标记和清除动作,导致执行效率降低。
第二个是内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多会导致当我们以后需要一大块连续的内存空间的时候就无法找到相对应的内存空间,就可能再一次触发垃圾收集。

2. 分段 - 复制算法
在这里插入图片描述
该算法每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象全部移动到另一块上面,然后把自己已使用过的内存空间一次清理掉。该算法的缺点就是如果有多数对象都是存活的,那么大量的对象将会在内存中复制移动,导致JVM卡顿。但是不用考虑有空间碎片的情况。这样的实现方式虽然弥补了标记清除算法的空间碎片问题,不过其中的缺点也是显而易见的。

3. 标记 - 整理算法
在这里插入图片描述
其中该算法中的标记依然与“标记 - 清除”算法一样,但后面的步骤不是直接对可回收的对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉另一端的对象。标记 - 清除是非移动式的回收算法,而标记 - 整理是移动式的回收算法。

4. 分代收集算法
在这里插入图片描述
该算法会根据对象的寿命,如果年龄越大那么被回收的几率也就越小,如果年龄越小则被回收的几率就越大。
那么它是如何给对象进行年龄增长的呢:其中分代收集算法,如果某个对象经历过一次垃圾回收那么该对象将长一岁,存活得越久那么岁数就越大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值