java weakreference测试未按预期工作

kcugc4gi  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(362)

我有下面的代码。我的期望是代码应该打印出来 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;
        }
    }
}
yiytaume

yiytaume1#

没有理由假设gc会在这样的低压试验下激活。您必须执行一些操作以使gc运行。有一个system.gc()方法,但它只是对gc的一个提示,可能根本不做任何事情。

62lalag4

62lalag42#

在垃圾收集时收集弱引用。触发垃圾回收(例如通过 System.gc() ),或等待由于内存分配压力而发生的情况,以及 weakReference.get() 会回来的 null .
此外,现代的低延迟垃圾收集器(zgc和shenandoah)会延迟弱引用的收集,因此如果使用它们,就必须调用 System.gc() 定期(其触发的集合确实收集弱引用)。

相关问题