介绍
当JVM在回收某个对象之前,总会先调用这个对象的finalize()方法。
finalize()继承自Object类,该方法允许在子类中被重写,用于在对象被回收时进行资源释放,通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件,套接字和数据库连接等。但是,每个对象的finalize()方法只会执行一次。
Object类中的finalize方法:
protected void finalize() throws Throwable { }
Java对象的三种状态
1.可触及的:从根结点开始,可以到达这个对象
2.可复活的:对象的所有引用都被释放,但是对象可能在finalize()复活,这要是对象有重写的finalize()方法,且没有执行过
3.不可触及的:对象的finalize()被调用,并且没有复活,那么就会进入不可触及状态,该状态的对象不可能再复活了,必死无疑了
finalize()方法复活对象举例
class ObjectRelive {
public static ObjectRelive obj;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method excuted.");
obj = this;
}
@Override
public String toString() {
return "I am CanReliveObj.";
}
public static void invokeObjectRealive() throws InterruptedException {
obj = new ObjectRelive();
obj = null; //复活对象
System.gc();//主动发起一次 GC
Thread.sleep(500); //finalize 方法会由低优先级线程执行,此处进行等待
if (obj == null) {
System.out.println("obj is null.");
} else {
System.out.println("obj is not null.");
}
obj = null;
System.out.println("第二次 GC.");
System.gc();
Thread.sleep(500);
if (obj == null) {
System.out.println("obj is null.");
} else {
System.out.println("obj is not null.");
}
}
}