JVM垃圾回收时的可触及性

可触及的
  1.从根节点可以触及到这个对象
可复活的
  1.一旦所有引用被释放,就是可复活状态
  2.因为在finalize()中可能复活该对象
不可触及的
  1.在finalize()后,可能会进入不可触及状态
  2.不可触及的对象不可能复活
  3.可以回收

package vm;

/**
 * Created by Administrator on 2017/5/30.
 */
public class CanReliveObj {
    public static CanReliveObj obj;
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("CanReliveObj finalize called");
        obj=this;
    }
    @Override
    public String toString(){
        return "I am CanReliveObj";
    }
    public static void main(String[] args) throws InterruptedException{
        obj=new CanReliveObj();
        obj=null;   //可复活
        System.gc();
        Thread.sleep(1000);
        if(obj==null){
            System.out.println("obj 是 null");
        }else{
            System.out.println("obj 可用");
        }
        System.out.println("第二次gc");
        obj=null;    //不可复活
        System.gc();
        Thread.sleep(1000);
        if(obj==null){
            System.out.println("obj 是 null");
        }else{
            System.out.println("obj 可用");
        }
    }
}

CanReliveObj finalize called
obj 可用
第二次gc
obj 是 null

 
原文地址:https://www.cnblogs.com/413xiaol/p/6920818.html