垃圾回收的finalize方法使用

来源:互联网 发布:centos查看防火墙端口 编辑:程序博客网 时间:2024/05/17 00:55
在跟搜索算法不可大的对象在GC时,至少要经过俩次标记过程才能真正的死亡,第一次标记和筛选时判断对象是否有必要执行finalize方法,当对象没有重写finalize方法或者finalize方法被虚拟机调用过,虚拟机将这俩种方法认为没有必要在执行finalize方法。如果有必要执行,这个对象将被放置在一个F_Queue队列中,并由一条虚拟机自动建立的、低优先级的Finalizer线程去执行。但并不保证一定会运行完此方法,通过finalize方法,对象可以和引用链上的对象建立关联,来进行自救(如下面的例子),那么在第二次标记此对象将会被溢出“即将回收”集合。

public class FinalizeEscapseGC {
public static FinalizeEscapseGC SAVE_HOOK=null;
public static FinalizeEscapseGC fe=null;
public void isAlive(){
System.out.println(“I am still Alive”);
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(“finalize method excute”);
FinalizeEscapseGC.SAVE_HOOK = this;
}
public static void main(String[] args) throws InterruptedException{
SAVE_HOOK = new FinalizeEscapseGC();
SAVE_HOOK = null;
System.gc();
Thread.sleep(500);
if(SAVE_HOOK!=null){
SAVE_HOOK.isAlive();
}else{
System.out.println(“SAVE_HOOK is dead”);
}
SAVE_HOOK = null;
System.gc();
Thread.sleep(500);
if(SAVE_HOOK!=null){
SAVE_HOOK.isAlive();
}else{
System.out.println(“SAVE_HOOK is dead”);
}
}
}
运行结果:
finalize method excute
I am still Alive
SAVE_HOOK is dead

Finalize方法只会被系统自动调用一次,建议不要用它拯救对象,因为它的运行代价高,不确定性大,try-catch可以做的更好。

0 0