我们知道java有垃圾回收器负责回收无用对象占据的内存资源,但也有特殊情况:假设你的对象(并非使用new)获得了一块特殊的内存区域,由于垃圾回收器只知道回收那些经由new分配的内存,所以它不知道如何释放该对象的这块特殊的内存。为了应对这种特殊情况,java允许在类中定义一个名为finalize()的方法。它的工作原理假定是这样的:一旦垃圾收集器准备释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,所以如果你打算用finalize(),就能在垃圾回收时刻做一些重要的清理动作。-----------《think in java》
我先说下我理解的重要的几点:
- finalize()方法会在对象被回收前调用
- 不建议使用finalize()方法
- finalize()的唯一的,不常用的作用就是在对象被回收前做一些检测,去发现一些程序的缺陷:
代码如下:
public class Test { public static void main(String[] args) { Book b = new Book(true); b.checkIn(); new Book(true); System.gc(); } static class Book { boolean checkout = false; Book(boolean checkout) { this.checkout = checkout; } void checkIn() { checkout = false; } @Override protected void finalize() throws Throwable { if (checkout) { System.out.println("该对象状态异常,应该先checkIn才能被收回"); } } } }
在上面的例子中,所有的Book对象在被当作垃圾回收前都应该被checkIn,但在main()方法中,由于我们的疏忽,导致有一本书未被checkIn。要是我们没在finalize()方法中验证的话,很难发现这种错误。