JVM垃圾回收时的可触及性

Posted 413Xiaol

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

以上是关于JVM垃圾回收时的可触及性的主要内容,如果未能解决你的问题,请参考以下文章

深入JVM垃圾回收

深入JVM垃圾回收

java 垃圾收集

JVM的GC理论详解

JVM之内存与垃圾回收篇虚拟机栈

JVM内存管理机制和垃圾回收机制