Effective Java 学习笔记第6条 --- 避免使用终结函数

终结函数(finalizer)可以用来回收不可到达的对象,就是说对象的生命周期结束后,可以用终结函数来回收为该对象分配的资源。


但是,终结函数执行线程的优先级很低,以至于我们不敢把对时间要求比较高的对象回收让终结函数来回收。JVM总是会延迟终结函数的执行。


对于急需回收对象,可以使用tyr finally,在finally写回收对象的代码,这样就保证对象能及时被回收。

// try-finally block guarantees execution of termination method
Foo foo = new Foo(...);
try {
    // Do what must be done with foo
    ...
} finally {
	foo.terminate(); // Explicit termination method
}
 

       终结函数其实也是有用的。第一种情况是当作安全网,当忘了对对象显示回收的时候,用终结函数作为最后的安全屏障。第二种情况是:普通对象通过一个本地方法 委托给本地对象叫本地对等体。本地对等体不是普通对象,所以当委托给他的对象被回收的时候本地对等体并不会被回收,所以这时候终结函数就派上用场了。


最后要注意的是,当子类改写覆盖了超类的终结函数时候,如果不显示调用超类的终结函数,那么超类的终结函数将不会被执行。

 

	// Manual finalizer chaining
	protected void finalize() throws Throwable {
		try {
		// Finalize subclass state
		...
		} finally {
			super.finalize();
		}
	}

 

      总结:尽量不使用终结函数,除非作为安全网或者是用来回收不关键的本地资源。

你可能感兴趣的:(java,jvm)