为什么自从 java 9 PhantomReference java doc 声明它专用于 POST-mortem 清理操作,尽管它之前是 PRE-mortem

gst*_*low 3 java garbage-collection phantom-reference resource-cleanup

PhantomReference java 8及以下版本的java doc如下所示:

Phantom 引用对象,在收集器确定它们的引用对象可能会被回收后入队。幻像引用最常用于以比 Java 终结机制更灵活的方式调度预检清理操作。如果垃圾收集器在某个时间点确定幻像引用的所指对象是幻像可达的,那么在那个时候或稍后的某个时间它将将该引用加入队列。

为了确保可回收对象保持如此,可能无法检索幻像引用的所指对象:幻像引用的 get 方法始终返回 null。

与软引用和弱引用不同,幻像引用在入队时不会被垃圾收集器自动清除。可通过幻像引用访问的对象将保持不变,直到所有此类引用都被清除或自身变得无法访问

PhantomReference java 9及更高版本的java doc如下所示:

Phantom 引用对象,在收集器确定它们的引用对象可能会被回收后入队。虚拟引用最常用于安排事后清理操作。假设垃圾收集器在某个时间点确定某个对象是虚拟可达的。届时,它将自动清除对该对象的所有幻影引用以及对该对象可从中访问的任何其他幻影可访问对象的所有幻影引用。同时或稍后它会将那些注册到引用队列的新清除的幻像引用加入队列。

为了确保可回收对象保持如此,可能无法检索幻像引用的所指对象:幻像引用的 get 方法始终返回 null。

java 9中的PhantomReference行为是否发生了变化?还是只是 Java 创始人重新思考了该课程的奉献精神?

Ale*_*lev 8

从 Java 9 开始,PhantomReference(PR) 被自动清除。您看到的是该更改导致的 Javadoc 更改。

在 Java 9 之前,PR 引用的对象保持活动状态,即使它get()会返回null. 因此,在 PR 本身死亡之前,所指对象在技术上是活着的,尽管您无法获得对它的引用。这种行为的好处不是很明显。无论如何,公关处理将是“事前清理”。

在 Java 9 之后,PR 在入队之前被清除(就像其他类型的弱/软引用一样),在 PR 被应用程序代码处理之前,所指对象本身变得完全死亡,这将是“事后清理”。