• 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)

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

  • 相关阅读:
    GCC优化相关
    【马蹄集】—— 数论专题
    担忧CentOS停服?KeyarchOS系统来支撑
    JS篇章高频面试题【2023】
    Elasticsearch:使用向量搜索来查询及比较文字 - NLP text embedding
    贪心算法(三) | 两个维度权衡问题 | leecode刷题笔记
    有趣的java面试题-基础篇(一)
    ArcGIS Pro、ChatGPT、Python、InVEST等多技术融合的水文、生态、气候变化等地学领域科研及项目综合能力提升
    【技巧】如何快速给每张PPT同时插入不同的图片?
    C#:实现点是否在多边形内算法​(附完整源码)
  • 原文地址:https://blog.csdn.net/weixin_45754865/article/details/126914697