如何确定 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.
在这种情况下,可以通过遍历 wr
和 sr
到达 str
,这意味着遍历通过软引用。我可以说 str
是软可达的吗?但是在 Chains of reference objects 部分之后 doc,似乎 str
是弱可达的。
要使引用软可达,软引用本身必须强可达或软可达.
您可以将这些引用视为一条链:一端是一个锚点(垃圾收集根:例如活动线程或 class 字段中的引用)。另一端是你的对象。
整个链条不能强于中间的任何元素,因为只要任何元素中断,整个链条就会中断,此时您将失去对对象的访问权。
垃圾收集器在清除软引用之前清除弱引用,因此弱引用比 软引用.
弱
这意味着你的例子:一旦垃圾收集器清除了对 SoftReference
对象的弱引用,你的对象/字符串就不可访问并且将被垃圾收集,即使垃圾收集器还没有清除软引用对象。
在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.
在这种情况下,可以通过遍历 wr
和 sr
到达 str
,这意味着遍历通过软引用。我可以说 str
是软可达的吗?但是在 Chains of reference objects 部分之后 doc,似乎 str
是弱可达的。
要使引用软可达,软引用本身必须强可达或软可达.
您可以将这些引用视为一条链:一端是一个锚点(垃圾收集根:例如活动线程或 class 字段中的引用)。另一端是你的对象。
整个链条不能强于中间的任何元素,因为只要任何元素中断,整个链条就会中断,此时您将失去对对象的访问权。
垃圾收集器在清除软引用之前清除弱引用,因此弱引用比 软引用.
弱这意味着你的例子:一旦垃圾收集器清除了对 SoftReference
对象的弱引用,你的对象/字符串就不可访问并且将被垃圾收集,即使垃圾收集器还没有清除软引用对象。