企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### [`finalize()`的用途](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=finalize-%e7%9a%84%e7%94%a8%e9%80%94) 如果你不能将`finalize()`作为通用的清理方法,那么这个方法有什么用呢? 这引入了要记住的第3点: 3. 垃圾回收只与内存有关。 也就是说,使用垃圾回收的唯一原因就是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是`finalize()`方法),它们也必须同内存及其回收有关。 但这是否意味着如果对象中包括其他对象,`finalize()`方法就应该明确释放那些对象呢?不是,无论对象是如何创建的,垃圾回收器都会负责释放对象所占用的所有内存。这就将对`finalize()`的需求限制到一种特殊情况,即通过某种创建对象方式之外的方式为对象分配了存储空间。不过,你可能会想,Java 中万物皆对象,这种情况怎么可能发生? 看起来之所以有`finalize()`方法,是因为在分配内存时可能采用了类似 C 语言中的做法,而非 Java 中的通常做法。这种情况主要发生在使用"本地方法"的情况下,本地方法是一种用 Java 语言调用非 Java 语言代码的形式(关于本地方法的讨论,见本书电子版第2版的附录B)。本地方法目前只支持 C 和 C++,但是它们可以调用其他语言写的代码,所以实际上可以调用任何代码。在非 Java 代码中,也许会调用 C 的`malloc()`函数系列来分配存储空间,而且除非调用`free()`函数,不然存储空间永远得不到释放,造成内存泄露。但是,`free()`是 C 和 C++ 中的函数,所以你需要在`finalize()`方法里用本地方法调用它。 读到这里,你可能明白了不会过多使用`finalize()`方法。对,它确实不是进行普通的清理工作的合适场所。那么,普通的清理工作在哪里执行呢?