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的提示,可能根本不做任何事情。