Java WeakHashMap очистить - PullRequest
       61

Java WeakHashMap очистить

1 голос
/ 15 марта 2019

Я пытаюсь выяснить, как 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 я не вижу кода, который мог бы это сделать.

1 Ответ

1 голос
/ 15 марта 2019

WeakHashMap очищает себя.Вызывает getTable() (сам вызывается get, put и т. Д.), size() и resize(int) все первый вызов expungeStaleEntries , который выполняет итерацию ReferenceQueue GC'd Entries и удаляетих со стола.Сборщик мусора отвечает за помещение недоступных объектов WeakReference в очередь.

...