我了解了 Java 中引用对象的要点,以及软引用对象、弱引用对象和幻引用对象之间的基本区别。
但是,我没有完全理解 API 文档中的以下几点
来自 WeakReference<T> 的 API 文档:
“弱引用对象,不会阻止其引用对象被finalizable、finalized,然后回收。”
现在,bold 中的术语在 API 文档中没有任何解释,所以我想知道它们的确切含义,尤其是与或多或少已弃用的
Object.finalize 有关的内容()
方法的终结概念。来自 Reference<T> 的 API 文档:
public void clear()
:“此方法仅由 Java 代码调用;当垃圾收集器清除引用时,它会直接执行此操作,无需调用此方法。”public boolean enqueue()
:“此方法仅由 Java 代码调用;当垃圾收集器将引用入队时,它会直接执行,无需调用此方法。”同样,我不知道上面 2 个引号中的 “Java 代码” 是什么意思:我无权访问的 JVM 内部代码?或者,我具有只读/浏览访问权限的 JDK 代码?或者,最终用户自己的 Java 代码?
"directly, without invoking this method"部分告诉我JVM不需要调用这些方法。另一方面,“仅由 Java 代码” 部分告诉我,它不是最终用户的 Java 代码,而是 JVM 的代码(如果它指的是最终用户代码,那么我们将在几乎每个 Java 类的每个方法的所有 API 文档中都发现了这个短语!)。那么哪种解释是正确的,谁可以调用这个函数呢?
最佳答案
"Weak reference objects, which do not prevent their referents from being made finalizable, finalized, and then reclaimed."
这些都是垃圾收集过程中的所有阶段。对象首先被标记为可终结的,表示没有对它们的强引用。然后调用 finalize() 并将它们标记为已完成,最后回收内存。
public void clear(): "This method is invoked only by Java code; when the garbage collector clears references it does so directly, without invoking this method."
这就是说,当您作为程序员决定清除引用时,clear()
方法用于执行此操作,但是如果您要子类化 WeakReference
并覆盖 clear
方法,当对象被移除时,您将看不到 JVM 调用该方法。
enqueue
的引用本质上是在说同一件事。这是一个警告,您不能通过覆盖这些方法来与 GC 的工作进行交互。
关于Java:需要对引用对象的 API 文档进行说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20899990/