Java WeakReference 测试未按预期工作
Java WeakReference test not working as expected
我有下面的代码。我的期望是代码应该打印 Garbage Claimed
但它始终打印来自实际对象的值 Test Object
。我允许 testWeakReference()
帧弹出,这应该使 refTest
符合垃圾收集条件。然后我让线程休眠 10 秒,然后测试 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;
}
}
}
弱引用在垃圾回收时被回收。触发垃圾回收(例如通过 System.gc()
),或由于内存分配压力等待垃圾回收发生,并且 weakReference.get()
将 return null
.
此外,现代低延迟垃圾收集器(ZGC 和 Shenandoah)会延迟弱引用的收集,因此如果您使用它们,则必须定期调用 System.gc()
(其触发的收集确实会收集弱引用) .
没有理由假设GC会在如此低的压力测试下启动。您将不得不做一些导致 GC 运行 的事情。 是一个System.gc()方法,但它只是对GC的提示,可能根本不做任何事情。
我有下面的代码。我的期望是代码应该打印 Garbage Claimed
但它始终打印来自实际对象的值 Test Object
。我允许 testWeakReference()
帧弹出,这应该使 refTest
符合垃圾收集条件。然后我让线程休眠 10 秒,然后测试 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;
}
}
}
弱引用在垃圾回收时被回收。触发垃圾回收(例如通过 System.gc()
),或由于内存分配压力等待垃圾回收发生,并且 weakReference.get()
将 return null
.
此外,现代低延迟垃圾收集器(ZGC 和 Shenandoah)会延迟弱引用的收集,因此如果您使用它们,则必须定期调用 System.gc()
(其触发的收集确实会收集弱引用) .
没有理由假设GC会在如此低的压力测试下启动。您将不得不做一些导致 GC 运行 的事情。 是一个System.gc()方法,但它只是对GC的提示,可能根本不做任何事情。