垃圾回收算法

前言

垃圾回收器是虚拟机中十分重要的一部分,而垃圾回收算法这是垃圾回收的器的灵魂。所以垃圾回收器的重要程度不言而遇。接下来我们就对垃圾回收器的算法,进行一个大致的介绍。我们不会对算法的细节进行过多的描述,只会讲解大体的主要算法思路。

分代收集理论

说起垃圾回收器,不得不提分代收集理论。想比大家或多或少的,都听过老年代,新生代等等这类名词。不知道大家有没像我一样好奇过,为什么这个分(反正我是好奇过)。那么接下来,我就大概介绍下这个各个年龄代的由来(面试不一定会问到)。首先,年轻代,老年代等等,都是在垃圾收集器的分代理论之上的出来的。
分代收集理论,建立在两个分代假说之上:
(1)弱分代假说:多大多数的对象都是朝生夕灭的
(2)强分代假说:熬过多次垃圾收集过程的对象,就难以消亡。
所以根据这个理论,将收集器划分除了老年代和新生代,新生代也就是那个弱分代,老年代也就是所谓的强分代。为什么要这么划分呢。大家可以仔细想想,这样的话就说明,新生代产生的垃圾快而多,我是不是每次对新生代进行收集,就能释放大量的空间。同样的道理,我对老年代进行垃圾回收,是不是释放的空间很少。那我对新生代进行垃圾回收的频率大一些,对老年的垃圾回收频率第一点,这样是不是能最大化的提升垃圾回收的效率。所以新生代和老年代的划分,是十分的有必要的。因此垃圾回收器才可以每次只回收一个或者部分区域。因为也有了部分收集和整堆收集之分。而部分收集又分为:
(1)新生代收集
(2)老年代收集
(3)混合收集
同样的万事都是有利有弊的,分代收集,虽说大大提升了收集效率,但是同也会有一个问题。那就是在部分收集的时候,会有一个跨代引用的问题。什么是跨代引用呢。比如你是新生代的对象,但是你引用了老年代的对象,这样的话,我在判定你是否可以存活的时候(这里指的使用可达性分析理论(如果有同学不了解,可以看我之前的判定对象存活的那篇文章。)),我需要遍历整个老年代,这个代价就是十分的巨大了,老年代收集同理。所以为了避免这种情况发生,就有了记忆集(新生代上的一个全局的数据结构,把老年代划分成若干小块,标识出老年代那一块存在跨代引用,这样发生新生代收集的时候,只有包含了跨代引用小块内存的对象才会被加入到GCRoot扫描之中)这么一说。
到此为止,分代收集理论基本讲完,接下来我们说下垃圾回收算法。

标记-清除算法

标记的过程就是判定对象是否属于垃圾的过程(这个我在之前的文章里面有讲解,不在这里概述了,有需要的可以看看我之前的文章),清除就是垃圾占用的内存回收过来。
这个算法是最基础的算法,他有两个主要的缺点:
(1)执行效率不稳定,如果回收对象过多,就需要进行大量的标记和清除动作,导致标记和清除两个过程的执行效率随对象数量增长而降低。
(2)内存碎片化的问题,这里回收的空间会存在大量不连续的内存碎片,可能会导致要分配较大对象的时候,因为没有足够大的连续内存空间,导致提前触发另一次的垃圾回收动作。

标记-赋值算法

按内存,将容量划分为大小相等的两块,每次只用其中的一块。这一块内存用完了,就把或者的对象复制到另一块上面去,然后把使用过的那一块空间,一次性全部清理掉。这样虽然可以避免空间碎片化的问题。而且给对象分配内存的时候,也不用考虑有空间碎片化的复杂情况,只要移动堆顶指针,按顺序分配即可(这种方式也被称为指针碰撞,之前在讲创建对象的时候有详细讲过,想要了解的小伙伴,可以看看我之前的文章)。但是这种算法也有一种问题,就是当内存中的大量对象都是存活的时候,会产生巨大的内存间复制开销。而且会将可用内存变为之前的一半。
后来就对这个种策略进行了优化,就是不在按照一比一的比例划分新生代。而是把新生代划分为一块较大的Eden空间和两个较小的Survivor空间,分配内存的时候,只是用Eden和一块Survivor空间。然后在垃圾收集的时候,把Eden和一块Survivor空间中存活的对象复制到剩余的一块Survivor空间。然后清理掉已使用的Eden和Survivor空间。Hotpost虚拟机默认Eden空间和Survivor空间比例为8:1.
这种优化后的算法有一个问题,就是万一剩余存活的对象所需要的内存,大于survivor空间怎么办,这个时候,他会有一个担保机制,将对象通过担保机制分配到老年代(具体的担保机制,之后的文章会有详细介绍,这里不过多阐述),这对虚拟机来说就是安全的。

标记-整理算法

这个算法简单来说就是在标记清除的基础上,将所有的对象想内存空间的一端移动,然后直接清理掉边界以外的内存空间。但是移动对象必须要暂停用户的应用程序才能进行,风险很大,这个停顿,最初被叫做“stop the world”

总结

每个算法都有自己的利和弊,都有自己的应用场景。所以在垃圾回收的过程中,具体采用那种算法,或者混合算法,都要视情况而定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark---小鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值