jvm如何判断对象是存活还是已经死亡

引用计数法:

给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就+1,;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用。
优点:判定效率很高
缺点:
1、需要单独的字段存储计数器,增加存储空间的开销;
2、计数器每次赋值时,要做加减法操作,增加了时间的开销;
3、无法处理循环引用的问题,比如两个对象相互引用的问题,引用计数永远不可能为0,计算就不准确了,正是因为这个问题,几乎不使用这种方法,如下图,虽然obj1和obj2已经不再被使用了,但是他们的计数器都不为0,

public class MyObj {

    public MyObj myObj;
}
public static void main(String[] args) {
        MyObj obj1 = new MyObj();
        MyObj obj2 = new MyObj();
        obj1.myObj = obj2;
        obj2.myObj = obj1;
        obj1 = null;
        obj2 = null;
    }

可达性分析算法:

通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,被第一次标记,经过第二次判断,发现真的没有被使用了,才会被回收
优点:除了简单、高效执行之外,还能解决引用计数法中的循环引用的问题,目前较常用
GC Roots对象
1.虚拟机栈(栈帧中本地变量表)中引用的对象,如:各个线程被调用的方法中使用的参数、局部变量等
2.本地方法栈中JNI(Native方法)引用的对象
3.方法区中类静态属性引用的对象
4.方法区中常量引用的对象
5.所有被同步锁synchronized持有的对象
除了以上的几种还有其他的

猜你喜欢

转载自blog.csdn.net/dhj199181/article/details/108503951