Java:参考对象的API文档需要澄清

时间:2014-01-03 09:03:45

标签: java reference weak-references finalization

我得到了Java中引用对象的要点,以及soft,weak和phantom引用对象之间的基本区别。

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

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

    “弱参考对象,不会阻止他们的指示物被最终确定最终确定,然后回收。”

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

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

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

    public boolean enqueue()“此方法仅通过Java代码调用;当垃圾收集器将引用排入时,它直接直接执行,而不调用此方法

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

    “直接,不调用此方法”部分告诉我JVM不需要调用这些方法。另一方面,“仅由Java代码”部分告诉我,它不是最终用户的Java代码,而是JVM(如果它意味着最终用户代码,那么我们就是几乎每个Java类的每个方法都在所有API文档中找到这个短语!)。那么哪种解释是对的,谁可以称之为这个功能?

2 个答案:

答案 0 :(得分:3)

  

“弱引用对象,不会阻止其引用最终确定最终,然后回收。”

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

  

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

这就是说当你作为程序员决定清除引用时,使用clear()方法来做到这一点,但是如果你要继承WeakReference并覆盖clear在删除对象时,您不会看到JVM调用该方法。

enqueue的引用基本上是在说同样的话。警告您不能通过覆盖这些方法来与GC的工作进行交互。

答案 1 :(得分:1)

  • finalizable,finalized,然后reclaimed。”意味着收集垃圾。
  • 仅由java代码”表示从您的程序本身(包括JDK)调用 - 即您可能在某处调用ref.clear();。它还解释了GC(即JVM)确实有效地清除了引用,但使用了不调用clear方法的不同机制。例如,如果您将clear覆盖为无操作,则GC仍然可以“使参考”无效。