我得到了Java中引用对象的要点,以及soft,weak和phantom引用对象之间的基本区别。
但是,我并不完全理解API文档中的以下几点
来自WeakReference<T>的API文档:
“弱参考对象,不会阻止他们的指示物被最终确定,最终确定,然后回收。”
现在,API文档中的任何地方都没有解释粗体中的术语,所以我想知道它们的确切含义,特别是与或多或少已弃用的Object.finalize()
方法相关的含义最终确定的概念。
来自Reference<T>的API文档:
public void clear()
:“此方法仅通过Java代码调用;当垃圾收集器清除引用时,它直接执行,而不调用此方法“的
public boolean enqueue()
:“此方法仅通过Java代码调用;当垃圾收集器将引用排入时,它直接直接执行,而不调用此方法“的
同样,我不知道上面两个引号中的“Java code”是什么意思:我无法访问的JVM内部代码?或者,我只读/浏览访问的JDK代码?或者,最终用户自己的Java代码?
“直接,不调用此方法”部分告诉我JVM不需要调用这些方法。另一方面,“仅由Java代码”部分告诉我,它不是最终用户的Java代码,而是JVM(如果它意味着最终用户代码,那么我们就是几乎每个Java类的每个方法都在所有API文档中找到这个短语!)。那么哪种解释是对的,谁可以称之为这个功能?
答案 0 :(得分:3)
“弱引用对象,不会阻止其引用最终确定,最终,然后回收。”
这些是垃圾收集过程中的所有阶段。对象首先被标记为finalizable,表示没有强引用它们。然后调用finalize()并将它们标记为已完成,然后最终回收内存。
public void clear():“此方法仅由Java代码调用;当垃圾收集器清除引用时,它直接执行,而不调用此方法。”
这就是说当你作为程序员决定清除引用时,使用clear()
方法来做到这一点,但是如果你要继承WeakReference
并覆盖clear
在删除对象时,您不会看到JVM调用该方法。
enqueue
的引用基本上是在说同样的话。警告您不能通过覆盖这些方法来与GC的工作进行交互。
答案 1 :(得分:1)
ref.clear();
。它还解释了GC(即JVM)确实有效地清除了引用,但使用了不调用clear
方法的不同机制。例如,如果您将clear
覆盖为无操作,则GC仍然可以“使参考”无效。