3

PhantomReference java 8和更少的 java doc 看起来像这样:

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

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

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

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

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

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

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

4

1 回答 1

8

从 Java 9 开始,PhantomReference(PR) 会自动清除。您看到的是由于该更改而带来的 Javadoc 更改。

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

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

于 2019-06-21T15:58:57.403 回答