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),特点:区域较大,对象存活率高。

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

     

  • 相关阅读:
    【数据库】事务,ACID,CAP和一致性
    线程,进程。多进程,多线程。并发,并行的区别
    mysql 集群 数据同步
    如何读取一个表的表类型,以及读取一个表中字段的类型.
    网络攻击技术开篇——SQL Injection
    MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
    程序员找工作那些事(一)幸存者偏差
    程序员
    preg_replace的一些细节
    HDU 1258 Sum It Up(dfs 巧妙去重)
  • 原文地址:https://www.cnblogs.com/xingrui/p/10350740.html
Copyright © 2011-2022 走看看