Object的finalize()方法的作用是否与C++的析构函数作用相同
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中强引用、软引用、弱引用、虚引用有什么用
强引用
软引用
软引用还可以配合引用队列去使用
弱引用
弱引用还可以配合引用队列去使用
虚引用
gc在回收对象时,这个对象具有虚引用,那么在回收前,回将虚引用加入引用队列中,通过判断引用队列中是否加入虚引用来了解被引用的对象是否被gc回收,可以起到哨兵的作用。
软引用和弱引用也可以先像上面这样配合ReferenceQueue使用。
总结