如何确定 java 中的参考可达性

How to determine reference reachability in java

在Java中,在引用链等一些复杂的情况下如何判断引用可达性?

假设在下面的示例中,str 是软件引用 sr 的引用对象,而 sr 是弱引用 wr.[=24 的引用对象=]

String str = "abc";
SoftReference<Object> sr = new SoftReference<>(str);
WeakReference<Object> wr = new WeakReference<>(sr);
str = null;
sr = null;

那么在这种情况下,str的可达性是多少?根据 Java 文档: An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference. 在这种情况下,可以通过遍历 wrsr 到达 str,这意味着遍历通过软引用。我可以说 str 是软可达的吗?但是在 Chains of reference objects 部分之后 doc,似乎 str 是弱可达的。

要使引用软可达,软引用本身必须强可达软可达.

您可以将这些引用视为一条链:一端是一个锚点(垃圾收集根:例如活动线程或 class 字段中的引用)。另一端是你的对象。

整个链条不能强于中间的任何元素,因为只要任何元素中断,整个链条就会中断,此时您将失去对对象的访问权。

垃圾收集器在清除软引用之前清除弱引用,因此弱引用软引用.

这意味着你的例子:一旦垃圾收集器清除了对 SoftReference 对象的弱引用,你的对象/字符串就不可访问并且将被垃圾收集,即使垃圾收集器还没有清除软引用对象。