我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地说明了当可能发生 OOM 时会发生这种情况,但是如果您完全丢弃引用怎么办,GC 会出现并收集 SoftReference 可能会注意到不存在其他强/软引用并清除内部引用值。
ReferenceQueue<Object> cleared = new ReferenceQueue<>();
Object X = new Object();
SoftReference<Object> Xs = new SoftReference<>(X, cleared);
Thread.sleep(10);
X = null;
Xs = null;
System.GC();
Thread.sleep(100);
Reference ref;
while ((ref = cleared.poll()) != null) {
System.err.println(ref);
}
那么这个队列的规则记录在哪里呢?必须有比我要问的更多的极端案例,所以也许这个问题必须扩大一点。