簡體   English   中英

Java WeakReference 測試未按預期工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM