机制: 自动释放不再使用的资源,垃圾回收释放的是对象使用的内存资源,不过对象可能会保存其他类型资源,如打开文件网络连接,垃圾回收期不会释放额外资源,因此,终极机制作用让开发者执行清理任务,如关闭文件,中断网络连接,删除临时文件,等等。
使用步骤:
如果可终结的对象不可达,会再内部终结队列存放一个引用,指向这个对象;而且,为了回收垃圾,这个对象呗标记为存活。
对象一个接着一个从终结队列移除,然后调用各自的finalize()方法。
调动终结方法后,不会立即释放对象,因为终结方法肯恩会把this,引用存储在某个地方(如某个类的公开静态字段中)
,让对象再次拥有引用,复活对象。
因此,调用finalize()后,垃圾回收子系统在回收对象前,必须重新判断对象是否可达。
不过,对象就算复活了,也不会再次调用终结方法。
定义finalize()方法的对象一般会多存活一个GC循环(如果生命周期长,会再多存活一个完整的GC循环)
场景:
在一个类中使用本地方法,打开某个非Java资源。就算遇到这种情况,也更适合使用处理资源的块状try语句,但也可以声明一个public native finalize()方法 (close()方法会调用这个方法)-------这个方法可以释放本地资源,包括不受Java垃圾回收程序控制的堆外内存。
细节:
在没有回收全部重要对象前,JVM可能就会推出,所以不会调用终结方法。
确保虚拟机退出前执行某些操作,可以使用Runtime.getRuntime().addShutDownHook钩子,在JVM退出前安全执行任意代码。
finalize()是实例方法,没有等效的机制用来终结类方法。
每个类只有一个finalize()方法。
终结方法可以抛出任何类型的异常或错误,但垃圾回收子系统自动调用终结方法时,终结方法抛出的任何异常
或错误都会被忽略,这些异常或错误只会导致错误方法返回。
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
System.out.println("addShutdownHook !");
}
});
System.out.println("main is over!");