gpt4 book ai didi

java - 为什么对 WeakRef 对象的 WeakReference 没有被垃圾回收?

转载 作者:行者123 更新时间:2023-12-03 21:14:29 25 4
gpt4 key购买 nike

在尝试使用 Wea​​kReferences 的一些示例时,我遇到了以下情况。我正在创建一个 hashmap 并用 Employee 对象的弱引用填充它。现在我有两个强引用, employee 和 weakReference 。我在 try block 中将两者都设置为 null。显式调用 gc,我终于运行了 block 。

所以在 gc 运行之后,它应该在堆中收集 weakReference 对象,因为没有对它的强引用,但是当我打印 map 时它仍然有指向旧 weakReference 对象的键。如何这可能吗?

            Employee employee = new Employee(11);
WeakReference<Employee>weakReference=new WeakReference<Employee>(employee);
Map map = new HashMap<WeakReference<Employee>, String>();
map.put(weakReference, "Test");
System.out.println(map);

try {
employee = null;
weakReference=null;
System.gc();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("Inside finally");
}

System.out.println(map);

输出是

{java.lang.ref.WeakReference@659e0bfd=Test}
Inside finally
{java.lang.ref.WeakReference@659e0bfd=Test}

最佳答案

弱引用本身就是被强引用的对象,只有它们指向的对象才被弱引用。

要在引用被清除时得到通知(以便您可以将其从 map 中删除),您可以使用 ReferenceQueue .这是可选的,因为您可以并且应该始终对访问进行 null 检查,但是如果从未访问过,这可能会导致无效的 WeakReference 对象累积。

必须清空队列,您可以在计时器上或在调用与包含弱引用的数据结构相关的函数时执行此操作。

阅读java.lang.ref package description会提供相同的高级概述。

关于java - 为什么对 WeakRef 对象的 WeakReference 没有被垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30645933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com