问题描述
在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.
在这种情况下,可以通过遍历 str
和 wr
到达 sr
,这意味着遍历通过软引用。我可以说 str
是软可达的吗?但是按照此 doc 中的引用对象链部分,str
似乎是弱可达的。
解决方法
要使引用软可达,软引用本身必须强可达或软可达。
您可以将这些引用视为一条链:一端是一个锚点(垃圾收集根:例如活动线程或类字段中的引用)。另一端是您的对象。
整个链条不能比中间的任何元素更强,因为只要任何一个元素断裂,整个链条就会断裂,并且在那一刻您失去了对对象的访问权限。
垃圾收集器在清除软引用之前先清除弱引用,因此弱引用比软引用弱>.
这意味着在您的示例中:一旦垃圾收集器清除对 SoftReference
对象的弱引用,您的对象/字符串将无法访问并将被垃圾收集,即使垃圾收集器尚未清除软引用对象。