zoukankan      html  css  js  c++  java
  • JVM中的垃圾回收算法GC

    GC是分代收集算法;因为Young区,需要回收垃圾对象的次数操作频繁;Old区次数上较少收集;基本不动Perm区。每个区特点不一样,所以就没有通用的最好算法,只有合适的算法。

                            

    GC的4大算法

      1、引用计数法(JVM实现一般不采用此方式)

        缺点:

          》每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的性能消耗。

          》较难处理循环引用

      2、复制算法:复制存活对象

        用在哪:年轻代中使用的是Minor GC,这种GC算法采用的复制算法(Copying)

         HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1:1,一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。因为年轻代中的对象基本都是朝生夕死的(90%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片

        缺点:

          (1)浪费一半内存

          (2)如果对象存活率比较高,那么我们需要将对象赋值,并且将引用复制一遍。所以复制算法想要使用,要求对象存活率比较低,还有克制50%内存浪费。

     3、标记清除(Mark-Sweep)

       老年代一般是由标记清除或标记清除与标记整理混合实现

       原理:

        第一步:从根集合开始扫描,对存活的对象进行标记

        第二步:再次扫描一遍,对未被标记的对象,进行清除

        优点:不需要额外的内存。

        缺点:两次扫描,耗时严重;清除不用的对象后,产生内存碎片。

    4、标记压缩(Mark-Compact)

      老年代一般是由标记清除或标记清除与标记整理混合实现。

      原理图:

        

       缺点:效率低;不仅要标记所有存活的对象,还要整理所有存活对象的地址,效率会低于复制算法。

       优点:内存不会有碎片。

    5、标记清除压缩(Mark-Sweep-Compact)

       就是标记清除和标记压缩的结合,特点是进行多次清除才会执行一次压缩。

    总结

      没有最好的算法,只有最合适的算法:分代收集算法。

    1、年轻代(Young Gen),特点:区域相对老年代较小,对象存活率低。

      这种情况下需要效率高的算法,所以复制算法很合适。

    2、老年代(Tenure Gen),特点:区域较大,对象存活率高。

      这种情况下,存在大量存活率高的对象,复制算法明显变得不合适。所以在老年代一般是由标记清除和标记压缩混合实现。

     

  • 相关阅读:
    关于表格
    split函数
    javac classpath和java classpath
    ORA01460: 转换请求无法实现或不合理 的原因
    业务流程学习(1)
    启动oracle10监听器错误:本地计算机上的OracleOraDb10g_home1TNSListener服务启动后又停止了 解决方案
    CF1594F. Ideal Farm
    CF1373G. Pawns
    CF1373F. Network Coverage
    CF1515F. Phoenix and Earthquake
  • 原文地址:https://www.cnblogs.com/xingrui/p/10350740.html
Copyright © 2011-2022 走看看