美文网首页
垃圾回收机制

垃圾回收机制

作者: 小川君 | 来源:发表于2018-10-05 09:31 被阅读0次

    java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象;
    堆被划分为两个不同的区域,由老年代和新生代 占比为2:1
    新生代被划分为三块区域:一个Eden和两个Survivor区域 占比为8:1:1

    新创建的对象一般在Eden和其中一个Survivor中,当新生代区域被占满之后,这时候会通过GC来进行垃圾回收,采用的算法是"复制"算法,并将存活下来的对象存放到
    另一个Survivor区域中,如果Survivor放不下的话,会存放到老年代区域中,并将Survivor中存活下来的对象进行进行年龄+1;以后每进行一次垃圾回收,存活下来
    的对象就会年龄+1;直到年龄满十五,可以将对象移动到老年代区域

    老年代区域中的对象相对来说不易回收,发生GC的频率相对来说也比较低,因此采用标记-整理的算法,在对象存活率高德情况下"复制"算法就要执行相对较多的复制
    操作,效率就会变低,所以会选择"标记-整理"算法

    垃圾回收算法:
    复制算法:
    将可用内存分成大小相等的两块,每次只使用其中一块,当发生GC的时候,会将存活的对象复制到另一块内存中,并进行排序整理,然后将原先的一块内存进行清理;
    实现简单,操作高效
    缺点也显而易见,可使用的内存降为原先的一半,并且如果存活的对象较多时,会执行较多的复制操作,效率会有下降
    标记-清除
    算法分为"标记"和"清除"两个阶段,首先标记出所有需要回收的对象,在标记完成之后统一回收被标记的对象
    缺点:
    1、效率问题,标记和清除的效率都不高
    2、标记清楚之后会产生大量的不连续的内存碎片,会导致当程序需要较大对象分配内存的时候无法找到足够的连续的内存儿不得不提前触发另一次垃圾
    回收动作。
    标记整理:
    在标记-清楚的基础上做了改进,标记阶段相同,标记完成之后不是最直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,在移动的过程中清理掉可回收的
    对象,这个过程叫做整理,不会产生像标记-整理那样所产生的内存碎片问题

    分代收集算法:
    根据内存中对象的存活周期不同,将内存划分为几块 也就是新生代和老年代

    相关文章

      网友评论

          本文标题:垃圾回收机制

          本文链接:https://www.haomeiwen.com/subject/kkrwoftx.html