-
介绍
假如你的对象(并非通过new)获得了一块内存区域,由于垃圾回收器只知道回收那些通过new分配的内存,所以它不知道该如何释放这块内存,为了应对这种特殊情况Java允许在类中定义一个名为finalize()的方法
-
工作原理
一旦垃圾回收器准备好释放对象占用的存储空间,将会首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,所以要是打算用finalize函数,就能在垃圾回收时刻做一些重要的清理动作。
-
注意说明
有三点需要注意
1:对象可能不被垃圾回收。
2:垃圾回收并不等同于“析构”(C++中销毁对象必须用到这个函数)
3:垃圾回收只与内存有关
-
用途
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存,所以对于与垃圾回收有关的任何行为来说(尤其是finalize函数),它们也必须同内存及其回收有关。
但这并不意味着对象中含有其他对象,finalize函数就应该明确释放那些对象,因为垃圾回收器会负责释放对象占据的所有内存。这就对finalize函数的需求限制为一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间,所以之所以要有finalize函数是由于在分配内存的时候可能采用了类似C语言的方法而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式,在非Java代码中也许会调用C的malloc()函数系列来分配空间,而且除非调用free()函数,否则存储空间会一直得不到释放,导致内存泄漏。free是C和C++的函数,所以需要在finalize()中使用本地方法调用它来释放内存。