• 判断Java对象死亡的两种常用算法


    当对象不馁引用的时候,这个对象就是死亡的,等待GC进行回收。

    1.引用计数法

    概念:

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

    但是:

    主流的java虚拟机并没有选用引用计数器算法,其中一个最主要的原因是:它很难解决对象之间是相互循环引用。

    优点:算法的实现简单,判定效率高,大部分情况下是一个不错的算法。很多地方应用到它

    缺点:

    引用和去引用伴随假发和减法,影响性能。

    致命的缺陷:对于循环引用的对象无法进行回收。

    2.根搜索算法(JVM采用的算法)

    概念:设立若干种根对象,当任何一个根对象(GC Root)到某一个对象均不可达时,则认为这个对象是可以被回收的。

    注意:这里提到,设立若干种根对象,当任何一个根对象到某一个对象均不可达时,则认为这个对象是可以被回收的。

    可达性分析:

    从根(GC root)的对象作为起始点,开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC root没有任何引用链相连(用凸轮的概念来讲,就是从GC Root到这个对象不可达)时,则证明此对象是不可用的。

     如上图所示,ObjectD和ObjectE是互相关联的,但是由于GC root到这两个对象不可达,所以最终D和E还是会被当做GC的对象,上图若是采用引用计数法,则A-E五个对象都不会被回收。

    根(GC roots)

    说到GC roots(GC根),在Java语言中,可以当做GC root的对象有以下几种:

    1.栈(栈帧的本地变量表)中引用的对象

    2.方法区中的静态成员。

    3.方法区中的常量引用的对象(全局变量)

    4.本地方法栈中JNI(一般说是Native方法)引用的对象。

    注意:第一和第四都是指的方法的本地变量表,第二种表达的意思比较清晰,第三种主要指的是生命为final的常量值。

    在根搜索算法的基础上,现在虚拟机的实现当中,垃圾收集的算法主要有三种,分别是标记-清除算法,复制算法,标记着呢管理算法。这三种算法都扩充了根搜索算法,不过他们理解起来还是非常好理解的。

  • 相关阅读:
    IT面试技巧(2)
    mySQL学习入门教程——4.内置函数
    weight decay (权值衰减)
    c++读取文件目录
    caffe 卷积层的运算
    一个物体多个标签的问题
    python caffe 在师兄的代码上修改成自己风格的代码
    caffe 细节
    vim让一些不可见的字符显示出来吧
    python 读写文件
  • 原文地址:https://www.cnblogs.com/LoganChen/p/6829165.html
Copyright © 2020-2023  润新知