【JVM篇】有哪些垃圾回收算法


在这里插入图片描述

🌹4种GC算法

🛸标记清除算法

主要分为下面2个阶段

  • 标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象
  • 清除阶段,从内存中删除没有被标记的对象(非存活对象)

在这里插入图片描述

🔎优缺点

优点:实现简单,只需要在第一阶段给每个对象维护标志位,第二阶段删除对象即可
缺点:

  • 碎片化问题:由于内存是连续的,所以在对象被删除后,内存中会出现很多细小的可用内存单元。如果我们需要的是一个比较大的空间,很有可能这些内存单元的大小过小从而无法分配
    在这里插入图片描述
  • 分配速度慢:由于内存碎片的存在,需要维护一个空闲链表,极有可能需要 多次遍历到链表的结尾 才能获得合适的内存空间
    在这里插入图片描述

🛸复制算法

  1. 准备2块空间From空间和To空间,每次在对象分配阶段,只能使用其中的一块空间(From空间)
  2. 在垃圾回收GC阶段,将From中存活对象复制到To空间
  3. 将2块空间的名字(From和To)互换
  4. 重复上述操作

🔎优缺点

在这里插入图片描述

🛸标记整理算法

也叫标记压缩算法,是对标记清理算法中容易产生垃圾碎片问题的一种解决方法
主要分为2个阶段

  1. 标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象
  2. 整理阶段,将存活对象移动到堆的一端,清理掉存活对象的内存空间

在这里插入图片描述

🔎优缺点

在这里插入图片描述

🍔分代垃圾回收算法(G1垃圾回收器)

在这里插入图片描述
分代回收时,创建出来的对象,首先会被放入到Eden伊甸园区。
在这里插入图片描述

随着对象在Eden区越来越多,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC或者Young GC

在这里插入图片描述
Minor GC会把Eden区和From区中需要回收的对象进行回收,把没有回收的对象放入到To区中,这样子,新创建的对象就能分到Eden区了

在这里插入图片描述
接下来,S0区会变成To区,S1区会变成From区。
当Eden区满的时候 再向里面放入对象,仍然会发送Minor GC

在这里插入图片描述

此时会回收Eden区和S1区的对象,并把Eden区和S1区中存活的对象放入到S0
在这里插入图片描述
注意:每次Monor GC中都会记录它的年龄,初始值为0,每次GC完后加1
如果Minor GC后的对象年龄达到阈值(最大15,默认值和垃圾回收器有关),会晋升到老年代中

在这里插入图片描述
如果老年代的空间不足,无法放入新的对象,先尝试Minor GC
在这里插入图片描述
如果还是不足,就会触发Full GC,Full GC会对整个堆进行垃圾回收
在这里插入图片描述
如果Full GC仍然无法回收掉老年代的对象,那么当对象继续放入到老年代的时候,就会抛出Out Of Memory异常

🔎优缺点

在这里插入图片描述

📒小结

在这里插入图片描述

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

在这里插入图片描述

相关推荐

  1. JVM垃圾回收算法

    2024-02-21 05:10:04       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-21 05:10:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-21 05:10:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-21 05:10:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-21 05:10:04       18 阅读

热门阅读

  1. Message Pack 协议详解及应用

    2024-02-21 05:10:04       35 阅读
  2. redis 主从模式,sentinel 模式配置

    2024-02-21 05:10:04       32 阅读
  3. 2402C++,C++26包索引

    2024-02-21 05:10:04       36 阅读
  4. SpringBoot

    2024-02-21 05:10:04       25 阅读
  5. js遇到的问题 --持续更新

    2024-02-21 05:10:04       30 阅读
  6. rust gui fltk

    2024-02-21 05:10:04       29 阅读
  7. Rabbitmq的几种模式的总结

    2024-02-21 05:10:04       30 阅读
  8. 学习数据接构和算法的第11天

    2024-02-21 05:10:04       31 阅读
  9. 【Git】切换分支【2024年2月19日】

    2024-02-21 05:10:04       29 阅读
  10. Spring设计模式之工厂模式创建Bean对象

    2024-02-21 05:10:04       28 阅读