我试着弄清楚在收集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源代码中的任何代码可以做到这一点。
WeakHashMap清理自己。调用getTable()
(本身称为get
,put
等),size()
和resize(int)
都首先调用expungeStaleEntries,它迭代GC'd Entries的ReferenceQueue并将其从表中删除。垃圾收集器负责将无法访问的WeakReference对象放在队列中。