- 当初的坑
final.finally,finalize 这三个有什么区别?没错,就是这样问的。撒时候学过finalize关键字?后来才发现,自己下意识的认知就是错的,明摆的坑要别人去跳。finalize不是关键字,是一个方法finalize();
- 工作发现
较前两个关键字的应用,finalize()基本用不到,之前的坑就见怪不怪了。在此,记录了解并备后用。
- finalize()简谈
它涉及到了Java的垃圾清理工作。Java有垃圾回收器负责回收无用对象占据的内存资源(由new分配)。如果,不是new分配而获得的一块"特殊"内存(下面说明),怎么释放?为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。**它的工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。**所以要是你打算用finalize(),就能在垃圾回收时做一些重要的清理工作。
"特殊"内存:分配内存时有可能采用了类似C语言的做法,而非Java中的通常做法。这种情况主要发生在使用"本地方法"的情况下。本地方法目前只支持C和C++,这两种语言可以调用其他语言写的代码,所以实际上可以调用任何代码。比如:在非java代码中,也许调用C的malloc()函数系列来分配存储空间,而且除非调用free()函数,否则存储空间得不到释放,从而造成内存泄露。当然,free()函数是C和C++中的函数,所以要在finalize()中用本地方法调用从而释放内存(记住:垃圾回收只与内存有关)。
- 小小的总结
不要过多的使用finalize(),它确实不是进行普通的清理工作的合适场所。通常,finalize()只能存在于程序员很难用到的一些晦涩用法里面。
- PS
API中对Object类finalize()的说明:protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法;