Object的finalize()方法的作用是否与C++的析构函数作用相同

Object的finalize()方法的作用是否与C++的析构函数作用相同

Object的finalize()方法的作用是否与C++的析构函数作用相同_第1张图片

public class Finalization {
    private static Finalization finalization;
    /**finalize在gc回收中有不确定性,所以不推荐用finalize进行回收*/
    @Override
    protected void finalize(){
        System.out.println("finalized");
        //System.gc()时,这一步可能没有被执行到就终止了,所以可能为null或对象地址。
        //可以让线程睡眠执行此步骤
        finalization=this;
    }

    public static void main(String[] args) {
        Finalization f = new Finalization();
        System.out.println("first print: "+f);
        f= null;
        //调用Finalization的finalize方法
        System.gc();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("second print: "+f);
        System.out.println(finalization);
    }
}


未加入线程休眠的代码,发现finalization可能输出为null

first print: com.gclhaha.javabasic.jvm.gc.Finalization@1b6d3586
second print: null
finalized
null


加入休眠代码后 

first print: com.gclhaha.javabasic.jvm.gc.Finalization@1b6d3586
finalized
second print: null
com.gclhaha.javabasic.jvm.gc.Finalization@1b6d3586


Java中强引用、软引用、弱引用、虚引用有什么用


强引用

Object的finalize()方法的作用是否与C++的析构函数作用相同_第2张图片
软引用

Object的finalize()方法的作用是否与C++的析构函数作用相同_第3张图片

软引用还可以配合引用队列去使用

 

弱引用

Object的finalize()方法的作用是否与C++的析构函数作用相同_第4张图片

弱引用还可以配合引用队列去使用

虚引用

gc在回收对象时,这个对象具有虚引用,那么在回收前,回将虚引用加入引用队列中,通过判断引用队列中是否加入虚引用来了解被引用的对象是否被gc回收,可以起到哨兵的作用。

软引用和弱引用也可以先像上面这样配合ReferenceQueue使用。

Object的finalize()方法的作用是否与C++的析构函数作用相同_第5张图片

总结
Object的finalize()方法的作用是否与C++的析构函数作用相同_第6张图片

Object的finalize()方法的作用是否与C++的析构函数作用相同_第7张图片

 

你可能感兴趣的:(JVM/GC,gc,jvm,finalize)