美文网首页
GC 两种算法(引用计数法和可达性分析算法)

GC 两种算法(引用计数法和可达性分析算法)

作者: 32b701b24e5b | 来源:发表于2019-07-10 17:29 被阅读0次

    一、引用计数法(ReferenceCounting)

    1、算法

        给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就+1,;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用。

    2、优缺点

    (1)优点

    判定效率很高。

    (2)缺点

    不会完全准确,因为如果出现两个对象相互引用的问题就不行了。如下代码所示:

    3、分析上述代码

    很明显,到最后两个实例都不再用了(都等于null了),但是GC却无法回收,因为引用数不是0,而是1,这就造成了内存泄漏。也很明显,现在虚拟机都不采用此方式。

    二、可达性分析算法(Reachability Analysis)

    1、算法

            通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

    (2.1)、红色代表不可达对象(可回收对象)

    (2.2)、千万注意!!!!!上图并不是说方法区全可达,虚拟机栈部分可达,本地方法栈全部不可达,而只是为了说明这三个部分可以作为GC Roots!

    3、可以作为GC Roots的对象包括以下几点

    (3.1)、虚拟机栈(栈帧中的本地变量表)中引用的对象。

    (3.2)、方法区中的类静态属性引用的对象或者常量引用的对象。

    (3.3)、本地方法栈中JNI(就是native方法)引用的对象。

    相关文章

      网友评论

          本文标题:GC 两种算法(引用计数法和可达性分析算法)

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