提到finalize方法,可能第一想法就是与C++的析构函数相同,但其实不然,我们先来看看finalize的作用:
一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以你打算用finalize,就能在垃圾回收时刻做一些重要的清理工作。
乍一看,似乎更贴近于析构函数的功能,但其实这里有个陷阱,C++中对象一定会被销毁(确切来说是应该被销毁,不然就会内存泄漏,毕竟C++是手动管理对象),但Java的对象并非总是被回收。
如果Java虚拟机JVM并未面临内存耗尽的情况,它是不会浪费时间去执行垃圾回收以恢复内存的。
所以,finalize作为通用的清理方法并不合适,因为它并不一定保证会被调用到,那这东西到底有啥用呢?
1. 清理其他语言占用的存储空间:Java中无论对象如何创建,垃圾回收器都会负责释放对象占据的所有内存。但有特殊情况,这就是本地方法。所谓本地方法,就是在Java代码中用非Java代码(比如C和C++)的方式。在非Java代码中,也许会调用C的malloc()函数来分配存储空间,而且除非用了free(),否则这部分存储空间将得不到释放,从而造成内存泄漏,可free()函数是C和C++的用法,所以此时finalize就派上用场了。
2.对象终结条件的验证