• JAVA——JVM中垃圾回收算法


    目录

    一、标记-清除算法

    二、标记-整理算法

    三、复制算法

    四、分代收集算法


    jvm中的五种垃圾回收算法,分别是:(1)标记-清除算法(2)标记-整理算法(3)复制算法(4)分代收集算法

    一、标记-清除算法

     此算法分为标记清除两个阶段,首先标记出要存活的对象,然后统一回收所有未标记的对象。

    缺点:

    (1)标记和清除的效率都交低。

    (2)如图可以看出,算法执行后会产生大量的不连续的空间碎片,对后面申请大的连续空间时就会产生影响。

    二、标记-整理算法

     同样也分为标记整理两个阶段,标记阶段和标记-清除算法一样,首相标记出要存活的对象,然后让标记的对象向一端移动整理,最后回收边界以外的内存。

    优点:相比于标记-清除算法,解决了大量不连续的碎片内存问题。

    缺点:在移动局部对象的过程中,降低了效率

    三、复制算法

     复制算法会将内存分配为大小相等的两块,每次使用其中的一块;然后罢使用的那块内存中存活的对象复制到另一块去,使用的那块空间一次清理掉。(就是平均分两成两块,一块满了,把存活的复制到立一块去,清理掉原来的)

    缺点:这样会使内存缩小一半(因为平均分成两份了)

    使用复制算法来回收新生代(yong generation如下图,主要发生在S0和S1):

    1、新生代(yong generation)内存分为两块,一块较大的endn空间和两块较小的survivor空间

    2、每次使用Eden和一块Survivor(比如S0),当进行回收时,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor(比如S1)空间上。然后,清理掉Eden和刚刚使用过的Survivor空间。(其中HotSpot虚拟机默认Eden和Survivor的大小比例为8 : 1

    四、分代收集算法

     分代收集一般包括年轻代、老年代 和 永久代

    新生代(Young generation)

    由第三点我们知道,新生代一开使使用的是endnr内存,当内存空间使用满了之后推向S0,在S0满了之后,进行一次GC清理,还有剩余的存活对象就复制到另外一个S1内存中,清除S0内存,然后继续接受endn分配的对象(这里使用复制了的S1),当S1满级了之后,又GC清除,剩余存活对象又复制到S0,依次反复,经历了15次GC的对象就会推到老年代。(简记:endn满推向S0,S0满GC,复制到S1,S1满GC,复制到S0,........15次后,老年代)

    其中大部分对象在新生代就会消失,这个过程叫做minor GC

    大量的对象在这里消失死亡,适合采用复制算法回收。

    老年代(old generation)

    在新生代存活下来的对象,会被拷贝到老年代,所以内存空间会比较大,而且在老年代中进行GC的次数没有新生代那么多,对象从老年代中消失的过程,可以称之为major GC(或者full GC)

    对象存活率高,适合使用标记-清理算法标记-整理算法进行回收

  • 相关阅读:
    Java基础-----StringBuffer和StringBuilder
    【超好懂的比赛题解】第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)
    使用rosserial实现ROS与Windows的service服务通信
    springboot流浪狗领养管理系统毕业设计源码260839
    R语言绘制不同颜色的带观测次数的条形图
    RK3568开发板在工控工业物联网网关方面的应用
    对话芯动科技 | 助力云游戏 4K级服务器显卡的探索与创新
    供应链全流程计划与排产解决方案核心功能概要
    C++Primer笔记:第一章:开始
    C/C++语言100题练习计划 86——数的计算(递推实现)
  • 原文地址:https://blog.csdn.net/weixin_45754865/article/details/126914697