【发布时间】:2015-10-16 16:03:40
【问题描述】:
我读到了 finalize() 方法,它是由垃圾收集器调用来释放内存的。 从文档中,finalize 用于进行清理活动。但是在这个“清理活动”中清理了哪些“东西”
【问题讨论】:
-
所有未引用的对象
标签: java garbage-collection finalize
我读到了 finalize() 方法,它是由垃圾收集器调用来释放内存的。 从文档中,finalize 用于进行清理活动。但是在这个“清理活动”中清理了哪些“东西”
【问题讨论】:
标签: java garbage-collection finalize
一种典型的清理类型是释放实例已分配的任何系统资源,例如FileInputStream 的文件描述符。
请注意,一个好的 Java 程序永远不会依赖在对象的终结器中执行的清理工作,而是会明确要求对象在其使用到期时释放资源。
不幸的是,JDK 中有一些丑陋的例子,其中终结器是唯一提供的机制。一个臭名昭著的是DirectByteBuffer,它分配本机(堆外)内存并且不提供任何公共方法来释放它。
【讨论】:
来自 Bruce Eckel 的“Thinking in Java”一书:
看起来 finalize( ) 已经到位,因为你可能会做某事 Clike 通过使用不同于 Java 中正常机制的机制分配内存。这个可以 主要通过本机方法发生,这是一种从 Java 调用非 Java 代码的方法。 C 和 C++ 是目前唯一支持的语言 本机方法,但由于它们可以调用其他语言的子程序,因此您可以有效地 叫什么。在非 Java 代码中,可能会调用 C 的 malloc() 系列函数来 分配存储,除非您调用 free(),否则该存储不会被释放,从而导致 内存泄漏。当然,free() 是一个 C 和 C++ 函数,所以你需要在本地调用它 你的 finalize() 中的方法。
阅读本文后,您可能会认为您不会使用 finalize( ) 很多。
【讨论】: