温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JVM中有几种GC算法

发布时间:2021-09-01 11:41:46 来源:亿速云 阅读:146 作者:小新 栏目:开发技术

这篇文章主要为大家展示了“JVM中有几种GC算法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JVM中有几种GC算法”这篇文章吧。

    介绍

    程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVM 的 GC 算法主要有下面四种:

    引用计数算法(Reference counting)

    算法思想:

    每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。

    核心思想:

    为每个对象额外存储一个计数器 RC ,根据 RC 的值来判断对象是否死亡,从而判断是否执行 GC 操作。

    优点:

    • 简单

    • 计算代价分散

    • “幽灵时间”短(幽灵时间指对象死亡到回收的这段时间,处于幽灵状态)

    缺点:

    • 不全面(容易漏掉循环引用的对象)

    • 并发支持较弱

    • 占用额外内存空间

    例子如图:

    初始状态:

    JVM中有几种GC算法

    改变引用后:

    JVM中有几种GC算法

    标记–清除算法(Mark-Sweep)

    算法思想:

    为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

    优点

    • 最大的优点是,相比于引用计数法,标记—清除算法中每个活着的对象的引用只需要找到一个即可,找到一个就可以判断它为活的。

    • 此外,这个算法相比于引用计数法更全面,在指针操作上也没有太多的花销。更重要的是,这个算法并不移动对象的位置(后面俩算法涉及到移动位置的问题)。

    缺点

    • 很长的幽灵时间,判断对象已经死亡,消耗了很多时间,这样从对象死亡到对象被回收之间的时间过长。

    • 每个活着的对象都要在标记阶段遍历一遍;所有对象都要在清除阶段扫描一遍,因此算法复杂度较高。

    • 没有移动对象,导致可能出现很多碎片空间无法利用的情况。

    例子如图

    这个图中,圆圈内灰色的对象就是已经死亡的对象,被标记为死亡,等待清除。

    JVM中有几种GC算法

    标记–整理算法

    算法思想

    标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。

    优点

    • 该算法不会像标记-清除算法那样产生大量的碎片空间。

    缺点

    • 如果存活的对象过多,整理阶段将会执行较多复制操作,导致算法效率降低。

    例子

    如图:

    JVM中有几种GC算法

    上面是标记阶段,下面是整理之后的状态。可以看到,该算法不会产生大量碎片内存空间。

    复制算法

    算法思想

    该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

    注意:

    这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

    优点

    • 实现简单

    • 不产生内存碎片

    缺点

    • 每次运行,总有一半内存是空的,导致可使用的内存空间只有原来的一半。

    以上是“JVM中有几种GC算法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI