Java WeakHashMap清理

问题描述 投票:1回答:1

我试着弄清楚在收集garbare之后WeakHashMap是如何清理的。正如你们许多人所知,WeakHashMap条目在其密钥被垃圾收集时会自动删除。但是,例如,如果我做这样的事情:

List<WeakReference<Main>> list = new ArrayList<>();
list.add(new WeakReference<>(new Main()));
System.gc();
Thread.sleep(1000);
list.get(0).get(); //null - WeakReference referent has been removed
list.get(0); //empty WeakReference object is still present in the List

ArrayList不会清除空的WeakReference对象,但为什么WeakHashMap会这样做?哪个组件负责此自动条目删除。我没有看到WeakHashMap源代码中的任何代码可以做到这一点。

java garbage-collection weak-references weakhashmap
1个回答
1
投票

WeakHashMap清理自己。调用getTable()(本身称为getput等),size()resize(int)都首先调用expungeStaleEntries,它迭代GC'd Entries的ReferenceQueue并将其从表中删除。垃圾收集器负责将无法访问的WeakReference对象放在队列中。

© www.soinside.com 2019 - 2024. All rights reserved.