如何确定java中的引用可达性

问题描述

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

假设在以下示例中,str 是软件引用 sr 的所指,而 sr弱引用 wr 的所指。

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. 在这种情况下,可以通过遍历 strwr 到达 sr,这意味着遍历通过软引用。我可以说 str 是软可达的吗?但是按照此 doc 中的引用对象链部分,str 似乎是弱可达的。

解决方法

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

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

整个链条不能比中间的任何元素更强,因为只要任何一个元素断裂,整个链条就会断裂,并且在那一刻您失去了对对象的访问权限。

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

这意味着在您的示例中:一旦垃圾收集器清除对 SoftReference 对象的弱引用,您的对象/字符串将无法访问并将被垃圾收集,即使垃圾收集器尚未清除软引用对象。