服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - JVM中四种GC算法案例详解

JVM中四种GC算法案例详解

2021-12-13 13:19rocketeerli Java教程

这篇文章主要介绍了JVM中四种GC算法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

介绍

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

 

引用计数算法(Reference counting)

算法思想:

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

核心思想:

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

优点:

  • 简单
  • 计算代价分散
  • “幽灵时间”短(幽灵时间指对象死亡到回收的这段时间,处于幽灵状态)

缺点:

  • 不全面(容易漏掉循环引用的对象)
  • 并发支持较弱
  • 占用额外内存空间

例子如图:

初始状态:

JVM中四种GC算法案例详解

改变引用后:

JVM中四种GC算法案例详解

 

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

算法思想:

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

优点

  • 最大的优点是,相比于引用计数法,标记―清除算法中每个活着的对象的引用只需要找到一个即可,找到一个就可以判断它为活的。
  • 此外,这个算法相比于引用计数法更全面,在指针操作上也没有太多的花销。更重要的是,这个算法并不移动对象的位置(后面俩算法涉及到移动位置的问题)。

缺点

  • 很长的幽灵时间,判断对象已经死亡,消耗了很多时间,这样从对象死亡到对象被回收之间的时间过长。
  • 每个活着的对象都要在标记阶段遍历一遍;所有对象都要在清除阶段扫描一遍,因此算法复杂度较高。
  • 没有移动对象,导致可能出现很多碎片空间无法利用的情况。

例子如图

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

JVM中四种GC算法案例详解

 

标记C整理算法

算法思想

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

优点

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

缺点

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

例子

如图:

JVM中四种GC算法案例详解

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

 

复制算法

算法思想

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

注意:

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

优点

  • 实现简单
  • 不产生内存碎片

缺点

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

 

总结

不同算法有不同的优点和缺点,除了引用计数法不常用外,其他三种算法在现在的java虚拟机上也是很常见的,间接说明了这几个经典算法还是有其适用性的。

理解 JVM 的 GC 算法能够帮助我们更好地理解java的垃圾回收机制,例如,在 JVM 的年轻代使用的是复制算法来进行垃圾回收(由于其中的存活对象比例较小);而在老年代,使用的却是标记-清除法或标记-整理法(由于每次回收都只回收少量对象)

到此这篇关于JVM中四种GC算法案例详解的文章就介绍到这了,更多相关JVM中四种GC算法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Seriousplus/article/details/80780243

延伸 · 阅读

精彩推荐
  • Java教程springboot中如何通过cors协议解决跨域问题

    springboot中如何通过cors协议解决跨域问题

    这篇文章主要介绍了springboot中通过cors协议解决跨域问题,cors是一个w3c标准,它允许浏览器(目前ie8以下还不能被支持)像我们不同源的服务器发出xmlHttpR...

    liben042911352021-04-30
  • Java教程从HelloWorld和文档注释开始入门Java编程

    从HelloWorld和文档注释开始入门Java编程

    这篇文章主要介绍了从HelloWorld和文档注释开始入门Java编程,涉及到Javadoc工具的使用,需要的朋友可以参考下 ...

    简一3682020-01-12
  • Java教程Spring Boot 简介(入门篇)

    Spring Boot 简介(入门篇)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。下面通过本文给大家介绍spring boot相关知识,需要的...

    Java之家2822020-09-17
  • Java教程Java数组的定义、初始化、及二维数组用法分析

    Java数组的定义、初始化、及二维数组用法分析

    这篇文章主要介绍了Java数组的定义、初始化、及二维数组用法,结合具体实例形式分析了java数组概念、功能、数组定义、静态数组、动态数组、二维数组等...

    贝贝爱豆豆9622021-07-02
  • Java教程聊一聊Java反射

    聊一聊Java反射

    工作中哪些地方比较容易用到反射,这篇文章就为大家介绍了工作中常用到的Java反射,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    李岩飞1662020-07-01
  • Java教程新手初学Java List 接口

    新手初学Java List 接口

    这篇文章主要介绍了Java集合操作之List接口及其实现方法,详细分析了Java集合操作中List接口原理、功能、用法及操作注意事项,需要的朋友可以参考下...

    费强胜5632021-09-29
  • Java教程Java内部类知识汇总

    Java内部类知识汇总

    在Java中,在类内部可以定义成员变量与方法,还可以在类的内部定义类.这种在类的内部定义的类称为内部类.而内部类所在的类称为外部类....

    好好De活着9232021-04-09
  • Java教程浅谈Java分布式架构下如何实现分布式锁

    浅谈Java分布式架构下如何实现分布式锁

    这篇文章主要介绍了浅谈Java分布式架构下如何实现分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    林口2662020-07-25