Допустим, мы удаляем запись <k,v>
из ConcurrentHashMap
. Операция удаления в ConcurrentHashMap
клонирует узлы, предшествующие узлу, который необходимо удалить.
Теперь мой вопрос: как мусор Java собирает исходные узлы, предшествующие узлам, которые необходимо удалить.
Допустим, _4 _---> _ 5 _---> _ 6 _---> _ 7 _---> _ 8 _---> _ 9_ - это список хеш-аутентификации, который поддерживается ConcurrentHashMap
. Теперь мы хотим удалить 3
.
Следующий код - это фрагмент кода метода удаления в Java ConcurrentHashMap
HashEntry newFirst = e.next;
for (HashEntry p = first; p != e; p = p.next) {
newFirst = new HashEntry(p.key, p.hash, newFirst, p.value);
tab[index]= newFirst;
}
После 1-й итерации
1
--->2
--->3
--->4
--->5
--->6
1A
--->2A
--->4
--->5
--->6
Будет создан новый узел
1A
, который будет указывать на4
. Исходный узел3
все еще указывает на узел4
. Таким образом, узел4
указывается двумя узламиПосле 2-й итерации
1
--->2
--->3
--->4
--->5
--->6
1A
--->2A
--->4
--->5
--->6
Узел
4
теперь является указателем на два списка (_42 _---> _ 43 _---> _ 44_) и (_45 _---> _ 46_). Исходные узлы, предшествующие узлу4
(_48 _---> _ 49 _---> _ 50_), никогда не удаляются из списка хеш-аутентификации.
Разве это не случай утечки памяти. Как сборщик мусора будет собирать (_51 _---> _ 52 _---> _ 53_), если на них все еще ссылается ConcurrentHashMap
?