1、Java的垃圾自动回收机制是不可控的
我们知道Java的垃圾回收(garbage collection)的工作机制是:当一个对像的引用不在存在时,就认为该对象不再需要,并且可以自动解除分配的内存,也就是说回收了该对象占用的内存。这种回收内存事件的发生不会简单地因为一个或多个对象不再需要就进行垃圾回收,程序人员对Java的垃圾自动回收是不可控制的。
2、对象销毁时需要特定动作怎么办?
有时,对象销毁时需要执行一些动作,例如:如果对象包含一些非Java资源,比如文件句柄(声音、图像文件等)或者字符字体,那么您可能希望确保这些资源在对象销毁之前释放内存。为了处理这种情况,Java提供了一种称为“终结”的机制。通过使用终结机制,可以定义当对象即将被垃圾回收期回收时放生的特定动作。
3、给Java类添加终结器
为了给类添加终结器(finalizer),可以简单地定义finalize()方法。当即将回收类的对象时,Java运行时会调用该方法。在finalize()方法内部,可以指定在销毁对象之前必须执行的那些动作。
4、示例
class Vehicle extends Object{
private int id;
public Vehicle(int id){
this.id = id;
System.out.println("Vehicle Object " + id + " is created");
}
protected void finalize() throws java.lang.Throwable{
super.finalize();
System.out.println("Vehicle Object " + id + " is disposed");
}
}
public class FinalizeDemo { public static void main(String[] args){ Vehicle car1 = new Vehicle(1001); Vehicle car2 = new Vehicle(1002); Vehicle car3 = new Vehicle(1003); car2 = null; car3 = null; System.gc();//Invoke the Java garbage collector } }
运行结果:
Vehicle Object 1001 is created Vehicle Object 1002 is created Vehicle Object 1003 is created Vehicle Object 1003 is disposed Vehicle Object 1002 is disposed