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



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

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

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

    "弱引用对象,不阻止其引用被设置为可终结已终结收。">

    现在,API文档中还没有解释bold中的术语,所以我想知道它们的确切含义是什么,尤其是关于或多或少被弃用的Object.finalize()方法的终结概念。

  2. 从API参考文档<T>:

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

    public boolean enqueue():"此方法仅由Java代码调用;当垃圾收集器将引用排入队列时,它直接执行,而不调用此方法。">

    同样,我不知道上面两句话中的"Java代码">是什么意思:我无法访问的JVM内部代码?或者,我可以只读/浏览访问的JDK代码?或者,最终用户自己的Java代码?

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

"弱引用对象,它不阻止它们的引用被设置为可终结已终结收。">

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

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

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

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

  • ">可最终化、最终化,然后回收。"表示垃圾已收集
  • ">仅由java代码调用"意味着从程序本身(包括JDK)调用,也就是说,您可能在某个地方有一些代码调用ref.clear();。它还解释了GC(即JVM)确实有效地清除了引用,但使用了一种不调用clear方法的不同机制。例如,如果将clear重写为无操作,GC仍然可以"取消"引用

相关内容

  • 没有找到相关文章

最新更新