3

我了解了 Java 中引用对象的要点,以及软引用对象、弱引用对象和幻像引用对象之间的基本区别。

但是,我不完全理解 API 文档中的以下几点

  1. 来自WeakReference<T>的 API 文档:

    “弱引用对象,不会阻止它们的引用对象被最终化,最终化,然后被回收。”

    现在, API 文档中的任何地方都没有解释粗体字的术语,所以我想知道它们的确切含义,特别是与或多或少不推荐使用Object.finalize()的方法的终结概念有关。

  2. 来自Reference<T>的 API 文档:

    public void clear()“此方法仅由 Java 代码调用;当垃圾收集器清除引用时,它会直接清除引用,而不调用此方法。”

    public boolean enqueue()“此方法仅由 Java 代码调用;当垃圾收集器将引用入队时,它直接这样做,而不调用此方法。”

    同样,我不知道上面 2 句引号中的“Java 代码”是什么意思:我无权访问的 JVM 内部代码?或者,我具有只读/浏览访问权限的 JDK 代码?或者,最终用户自己的 Java 代码?

    直接,不调用这个方法”部分告诉我JVM不需要调用这些方法。另一方面,“仅由 Java 代码”部分告诉我,它不是最终用户的 Java 代码,而是 JVM 的(如果它意味着最终用户代码,那么我们会发现这个短语在所有几乎每个 Java 类的每个方法的 API 文档!)。那么哪种解释是正确的,谁能调用这个函数呢?

4

2 回答 2

3

“弱引用对象,不会阻止它们的引用对象被最终化,最终化,然后被回收。”

这些都是垃圾收集过程中的所有阶段。对象首先被标记为可终结,以表示没有对它们的强引用。然后调用 finalize() 并将它们标记为 finalized,然后最终回收内存。

public void clear():“这个方法只能由 Java 代码调用;当垃圾收集器清除引用时,它会直接清除引用,而不调用这个方法。”

这就是说,当您作为程序员决定清除引用时,该clear()方法将用于执行此操作,但是如果您要子类WeakReference化并覆盖该clear方法,则在删除对象时您将看不到 JVM 调用该方法。

的报价enqueue本质上是在说同样的事情。这是一个警告,您不能通过覆盖这些方法与 GC 的工作进行交互。

于 2014-01-03T09:24:30.247 回答
1
  • finalizable,finalized,然后reclaimed。 ”意思是垃圾回收。
  • 仅由 java 代码”表示从您的程序本身(包括 JDK)调用 - 即您可能在某处有一些代码调用ref.clear();. 它还解释了 GC(即 JVM)确实有效地清除了引用,但使用了不调用该clear方法的不同机制。例如,如果您覆盖clear为无操作,GC 仍将能够“使”引用“无效”。
于 2014-01-03T09:24:51.513 回答