美文网首页
java的垃圾收集器

java的垃圾收集器

作者: 小白牙_2fc6 | 来源:发表于2019-08-05 20:41 被阅读0次

        前言:在java虚拟机中堆内存保存着java实例,在执行代码的过程中,有的对象是全局变量,生命周期就长很多,而一些方法中的变量就是朝生夕灭。没有这种的机制,java的堆内存很快就消耗殆尽。

    一:首先就需要确定jvm怎么判断哪些对象是需要回收的,这就涉及GC算法

    1:引用计数算法:该算法言简意赅,就是程序中有引用一个对象时,该对象的引用就加1,但是该算法有个缺陷,当两个对象相互引用时,jvm就无法回收这两个对象。

    2: 可达性分析算法:通过"GC ROOTS"的对象作为起点向下搜索,搜索所走过的路径称为引用链,当一个对象没有任何引用链的时候证明这个对象不可用。可以GC回收。

    二:确定了哪些对象是可以回收了,就要开始真正的GC回收算法

    1:标记-清楚算法:标记出需要回收的对象,在标记完成后统一回收所有被标记的对象。

    有两个不足:效率不足,标记和清除两个过程的效率都不高,第二个就是空间原因,空间碎片太多可能会导致之后的程序运行时需要分配大对象,但是空间都是碎片化。导致会触发一次gc。

    2:复制算法:将空间分为Eden区,FromSurvivor区,ToSurvivor区。比例是8:1:1。每次使用eden和一个survivor。在gc时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor上,在清理掉Eden和刚才用过的survivor空间。(在对象存活率比较低的时候使用更合适)

    3:标记-整理算法:标记过程和标记清楚算法相同,后续的步骤不是直接对可回收的对象进行清理,而是让所有存活的对象都向一端移动,然后清理掉端边界以外的内存。

    4:分代收集算法:一般将java堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的GC算法,新生代由于对象朝生夕灭,使用复制算法,只需要复制少量的对象就可以完成GC、而老年代中因为对象存活率高,可以使用标记-清理或者标记-整理算法进行回收。

    三:垃圾回收器

    Serial收集器:是单线程进行gc回收,而且在回收的过程中会采用stop the world,会影响用户的体验。

    ParNew收集器:多线程gc回收。

    相关文章

      网友评论

          本文标题:java的垃圾收集器

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