码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【JVM篇】有哪些垃圾回收算法


    文章目录

    • 🌹4种GC算法
    • 🛸标记清除算法
      • 🔎优缺点
    • 🛸复制算法
      • 🔎优缺点
    • 🛸标记整理算法
      • 🔎优缺点
    • 🍔分代垃圾回收算法(G1垃圾回收器)
      • 🔎优缺点
    • 📒小结

    在这里插入图片描述

    🌹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异常

    🔎优缺点

    在这里插入图片描述

    📒小结

    在这里插入图片描述

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

    在这里插入图片描述

  • 相关阅读:
    pytorch 实现一个最简单的 GAN:用mnist数据集生成新图像
    Python 3 os.walk读取指定文件路径后,打印路径参数为空
    WebSocket封装(TypeScript、单例模式、自动重连、事件监听、Vue中使用)
    Steger算法实现结构光光条中心提取(python版本)
    LeetCode 第60天 | 84. 柱状图中最大的矩形 单调栈完结
    设计模式之组合模式
    「设计模式」原型模式
    Postman基础功能-前置脚本与接口关联
    SpringBoot整合Quartz
    前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(五)
  • 原文地址:https://blog.csdn.net/m0_72853403/article/details/136164127
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号