[英]Java WeakReference test not working as expected
我有下面的代碼。 我的期望是代碼應該打印Garbage Claimed
但它始終打印來自實際 object 的值,即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;
}
}
}
沒有理由假設 GC 在如此低的壓力測試下會啟動。 您將不得不做一些導致 GC 運行的事情。 有一個 System.gc() 方法,但它只是對 GC 的提示,可能根本不會做任何事情。
垃圾收集時會收集弱引用。 觸發垃圾收集(例如通過System.gc()
),或者由於 memory 分配壓力而等待垃圾收集發生,並且weakReference.get()
將返回null
。
此外,現代低延遲垃圾收集器(ZGC 和 Shenandoah)延遲了弱引用的收集,因此如果使用它們,則必須定期調用System.gc()
(其觸發的 collections 確實會收集弱引用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.