我试着弄清楚在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 ListArrayList不会清理空的WeakReference对象,但是为什么WeakHashMap要这样做呢?哪个组件负责该自动条目移除。我在WeakHashMap源代码中看不到任何可以做到这一点的代码。
发布于 2019-03-16 00:28:32
WeakHashMap会自我清理。对getTable() (本身由get、put等调用)、size()和resize(int)的调用都是首先调用expungeStaleEntries,它会迭代GC条目的ReferenceQueue并将它们从表中删除。垃圾收集器负责将无法到达的WeakReference对象放到队列中。
https://stackoverflow.com/questions/55186552
复制相似问题