美文网首页
深入理解JVM2-垃圾收集器1

深入理解JVM2-垃圾收集器1

作者: Minato666 | 来源:发表于2019-04-11 22:59 被阅读0次

    垃圾回收(Garbage Collection)需要完成三件事情:

    • 那些内存需要回收?
    • 什么时候回收?
    • 如何回收?
    哪些内存需要回收?

    在堆里面存放着Java世界几乎所有的对象实例,垃圾收集器对堆进行回收前,第一件事情就是要确定这些对象中,哪些还“存活着”,哪些已经“死去”(即不可能再被任何途径使用的对象)。

    引用计数算法

    给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的。引用计数算法(Reference Counting)的实现简单,判定效率也很高,但是很难解决对象之间的相互应用的问题。
    例如:

    
    /**
     * testGC()方法执行后,objA和objB会不会被GC呢?
     * @author zzm
     */
    public class ReferenceCountingGC {
    
    
        public Object instance = null;
        private static final int _1MB = 1024 * 1024;
    
    
        /**
        * 这个成员属性的唯一意义就是占点内存,以便能在GC日志中看清楚是否被回收过
        */
        private byte[] bigSize = new byte[2 * _1MB];
    
    
        public static void testGC() {
                ReferenceCountingGC objA = new ReferenceCountingGC();
                ReferenceCountingGC objB = new ReferenceCountingGC();
                objA.instance = objB;
                objB.instance = objA;
    
    
                objA = null;
                objB = null;
    
    
                //假设在这行发生GC,objA和objB是否能被回收?
                System.gc();
        }
    }
    

    objA 和objB相互引用,导致他们的计数都不为0,于是引用计数算法无法通知GC收集器回收他们。

    可达性分析算法

    可达性分析算法(Reachability Analysis)的基本思路就是通过一些列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象时不可用的。


    image.png

    如上图所示,对象object5, object6, object7虽然互相有关联,但是它们到GC Roots是不可达的,所以判定为是可回收的对象。
    在Java语言中,可作为GC Roots的对象包括下面几种:

    • 虚拟机栈(栈帧中的本地变量表)中引用的对象
    • 方法区中类静态属性引用的对象。
    • 方法区常量引用的对象
    • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

    相关文章

      网友评论

          本文标题:深入理解JVM2-垃圾收集器1

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