当一个对象没有被引用时,finalize()方法如何进行资源清理是不能被精确控制的。
finalize方法原型:protect void finalize() throws Throwable
但是我们依然可以强制系统进行垃圾回收,这种强制只是通知系统进行垃圾回收,但是系统是否进行垃圾回收依然是不确定的,大部分的时候还是有一些效果的
垃圾强制回收的两个方法
1、system类的gc()静态方法:system.gc()
2、runtime 对象的 gc()实例方法:Runtime.getRuntime().gc()
public class GcTest { public static void main(String[] args) { for (int i = 0; i <4 ; i++) { new GcTest(); // System.gc();与下述效果同样的,通知系统进行垃圾回收,所以finalize()方法会被执行。 Runtime.getRuntime().gc(); //当除去这两个方法时。系统暂时不会进行垃圾回收,从而finalize方法也不会被执行。所以编译时不会有任何输出。 } } public void finalize(){ System.out.println("system is cleaning GcTest"); } }
另外在简介一下finalize方法。
1.可恢复状态下的对象调用finalize方法时可以复活,到可达状态,相反到不可达状态时,会进行垃圾回收,
2.这个方法最后交给垃圾机制调用,不要主动调用,当其出现异常时(原型中throwable会抛出所有异常),垃圾回收机制不会出现任何异常。