我了解了Java中引用对象的要点,以及软引用对象、弱引用对象和虚引用对象之间的基本区别。
然而,我不完全理解API文档中的以下几点
-
来自WeakReference的API文档<T>:
"弱引用对象,不阻止其引用被设置为可终结、已终结收。">
现在,API文档中还没有解释bold中的术语,所以我想知道它们的确切含义是什么,尤其是关于或多或少被弃用的
Object.finalize()
方法的终结概念。 -
从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仍然可以"取消"引用