Collect from "Think in Java".
Java有垃圾回收器(以下称为GC)来回收不用的对象占据的内存资源。但也有特殊情况:
如果你的对象(并非使用new)获得了一块“特殊”的内存,由于GC只知道释放那些经由Java new分配的内存,所以GC不知道如何释放该对象的这块“特殊”的内存。
为了应对这种情况,Java允许在类中定义一个finalize()方法。它的工作原理“应该”是这样的:
一旦GC准备好释放对象占用的内存空间,将首先调用finalize()方法,并且在下一次GC进行垃圾回收时,才会真正地回收对象所占用的内存。
但需要强调:
这歌finalize()函数并不能看做C++的析构函数,在C++中,如果程序没有错误的话,对象是一定会被销毁的。而在Java中,并非所有对象都会被GC进行“回收”的。换句话说:
1、对象可能不被回收。
2、垃圾回收不等于析构。
这意味着在不需要某个对象之前,如果必须执行某些动作,那么就得需要自己手动来做。Java并未提供“析构函数”类似的概念,要做类似的清除工作,程序员必须手动创建一个执行清除工作的普通方法。
finalize()的用途
看完上面这一段话,相信读者都明白了——不能使用finalize()作为通用的垃圾回收方法。那么finalize()真正的用途是什么呢?
这里引出要记住的第三点:
3、垃圾回收只与内存有关。
其实要理解很简单,Java允许调用C/C++的函数、方法,而C/C++又可以调用其他语言的代码。所以,如果在C/C++编写的代码中,使用了malloc等进行内存的分配,此时GC就不能再释放这些内存了。所以这个时候,finalize()就该登场了。
你必须执行清除
Java不允许创建局部对象,程序员必须使用new,在Java中,也找不到”delete“来释放对象,因为GC会帮助你释放存储空间。但是,GC的存在并不能替代类似C++中的析构函数。如果你希望进行释放存储空间以外的清除工作,还是得明确调用某个恰当的Java方法。