为什么对WeakRef对象的WeakReference不进行垃圾收集?

阿尼涅

在使用WeakReferences尝试一些示例时,我遇到了以下情况。我正在创建一个哈希表,并在Employee对象上填充了一个弱引用。现在我有两个强引用,employee和weakReference。我在try块中都将它们都设置为null。显式地调用gc,最终得到了块运行。

因此,在gc运行之后,由于没有对它的强引用,所以应该在堆中收集weakReference对象,但是当我打印地图时,它仍然具有指向旧的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}
叶夫根尼(Evgeniy Dorofeev)

GC不会删除WeakReference本身,它只会删除其引用的对象,因此map仍将包含WeakReference。您应该检查的是weakReference.get()。在gc()之后应返回null。为了以防万一,请在检查之前创建一个Thread.sleep(1000),以便GC有一些时间来完成其工作

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在执行Java Stream终端操作时未对对象进行垃圾回收?

来自分类Dev

是否可以将对象标记为不进行垃圾收集?

来自分类Dev

JVM的Java对象垃圾收集

来自分类Dev

为什么要禁用垃圾收集器?

来自分类Dev

如何检查什么阻止对象符合垃圾收集条件?

来自分类Dev

为什么大型垃圾收集的速度比小型垃圾收集慢?

来自分类Dev

垃圾收集对象的数量

来自分类Dev

为什么垃圾收集器不会破坏弹簧容器

来自分类Dev

确保对象可以被垃圾收集

来自分类Dev

未在C#中进行垃圾收集。为什么?

来自分类Dev

WeakReference对象是否也与引用的对象一起进行了垃圾回收?

来自分类Dev

清除BST进行垃圾收集的最佳方法是什么?

来自分类Dev

为什么这里的早期术语没有被垃圾收集?

来自分类Dev

为什么不收集我的.NET垃圾?

来自分类Dev

为什么Shake建议禁用空闲垃圾收集?

来自分类Dev

为什么要进行垃圾收集?为什么编译器不自动插入free()?

来自分类Dev

为什么垃圾收集器不收集Tasks对象

来自分类Dev

GEKKO为什么不进行初始测量?

来自分类Dev

为什么不进行比较就返回假?

来自分类Dev

强制在节点中进行垃圾收集以测试WeakRef和FinalizationRegistry

来自分类Dev

为什么垃圾收集器在取消分配之前等待?

来自分类Dev

为什么这个对象没有得到垃圾收集?

来自分类Dev

为什么不收集这个Git commit垃圾?

来自分类Dev

为什么不收集我的.NET垃圾?

来自分类Dev

c#:为什么GC无法在我的代码中收集Weakreference的目标?

来自分类Dev

为什么文件全局不进行分词?

来自分类Dev

为什么活动没有收集到垃圾?

来自分类Dev

垃圾收集链接的对象

来自分类Dev

请告知错误是什么...为什么不进行编译?

Related 相关文章

  1. 1

    为什么在执行Java Stream终端操作时未对对象进行垃圾回收?

  2. 2

    是否可以将对象标记为不进行垃圾收集?

  3. 3

    JVM的Java对象垃圾收集

  4. 4

    为什么要禁用垃圾收集器?

  5. 5

    如何检查什么阻止对象符合垃圾收集条件?

  6. 6

    为什么大型垃圾收集的速度比小型垃圾收集慢?

  7. 7

    垃圾收集对象的数量

  8. 8

    为什么垃圾收集器不会破坏弹簧容器

  9. 9

    确保对象可以被垃圾收集

  10. 10

    未在C#中进行垃圾收集。为什么?

  11. 11

    WeakReference对象是否也与引用的对象一起进行了垃圾回收?

  12. 12

    清除BST进行垃圾收集的最佳方法是什么?

  13. 13

    为什么这里的早期术语没有被垃圾收集?

  14. 14

    为什么不收集我的.NET垃圾?

  15. 15

    为什么Shake建议禁用空闲垃圾收集?

  16. 16

    为什么要进行垃圾收集?为什么编译器不自动插入free()?

  17. 17

    为什么垃圾收集器不收集Tasks对象

  18. 18

    GEKKO为什么不进行初始测量?

  19. 19

    为什么不进行比较就返回假?

  20. 20

    强制在节点中进行垃圾收集以测试WeakRef和FinalizationRegistry

  21. 21

    为什么垃圾收集器在取消分配之前等待?

  22. 22

    为什么这个对象没有得到垃圾收集?

  23. 23

    为什么不收集这个Git commit垃圾?

  24. 24

    为什么不收集我的.NET垃圾?

  25. 25

    c#:为什么GC无法在我的代码中收集Weakreference的目标?

  26. 26

    为什么文件全局不进行分词?

  27. 27

    为什么活动没有收集到垃圾?

  28. 28

    垃圾收集链接的对象

  29. 29

    请告知错误是什么...为什么不进行编译?

热门标签

归档