我有下面的代码。我的期望是代码应该打印出来 Garbage Claimed
但它一直在打印实际对象的值 Test Object
. 我已经允许 testWeakReference()
要弹出的框架 refTest
有资格进行垃圾收集。然后在测试 WeakReference
已经有人认领了。
import java.lang.ref.WeakReference;
import java.util.Optional;
public class WeakHashMapTest {
public static void main(String[] args) throws InterruptedException {
WeakReference<RefTest> weakReference = testWeakReference();
Thread.sleep(10000l);
System.out.println(Optional.ofNullable(weakReference.get()).map(RefTest::getValue).orElse("Garbage claimed"));
}
private static WeakReference<RefTest> testWeakReference() throws InterruptedException {
RefTest refTest = new RefTest("Test Object");
WeakReference<RefTest> weakReference = new WeakReference(refTest);
return weakReference;
}
public static class RefTest {
private String value;
public RefTest(String val){
this.value = val;
}
public String getValue(){
return this.value;
}
}
}
2条答案
按热度按时间yiytaume1#
没有理由假设gc会在这样的低压试验下激活。您必须执行一些操作以使gc运行。有一个system.gc()方法,但它只是对gc的一个提示,可能根本不做任何事情。
62lalag42#
在垃圾收集时收集弱引用。触发垃圾回收(例如通过
System.gc()
),或等待由于内存分配压力而发生的情况,以及weakReference.get()
会回来的null
.此外,现代的低延迟垃圾收集器(zgc和shenandoah)会延迟弱引用的收集,因此如果使用它们,就必须调用
System.gc()
定期(其触发的集合确实收集弱引用)。