gpt4 book ai didi

java - 弱 HashMap 在取消引用后会立即释放内存吗?

转载 作者:行者123 更新时间:2023-11-30 02:43:35 29 4
gpt4 key购买 nike

这是将一些值放入 WeakHashMap 中然后从映射中删除这些值的代码片段。它如何处理分配的内存?

import java.util.*;
public class WeakHashMap_Main {
private static Map map;

public static void main(String args[]) {
map = new WeakHashMap();
map.put(new String("ABC"), "XYZ");
map.put(new String("DEF"), "PQR");

map.remove("ABC");
map.remove("DEF");
}
}

最佳答案

Java 文档(jdk1.8.0_71)说,

an entry in a WeakHashMap will automatically be removed if it's key is no longer in ordinary use. More precisely, the presence of a mapping for a given key will not prevent the key from being discarded by the garbage collector.

这清楚地表明,当 key已被丢弃,其Entry<K, V>也将从 Map 中删除.

现在,让我们深入了解一下当 key 时会发生什么。已移除。remove(Object o)的代码片段方法如下图:

public V remove(Object key) {
Object k = maskNull(key);
int h = hash(k);
Entry<K,V>[] tab = getTable();
int i = indexFor(h, tab.length);
Entry<K,V> prev = tab[i];
Entry<K,V> e = prev;

while (e != null) {
Entry<K,V> next = e.next;
if (h == e.hash && eq(k, e.get())) {
modCount++;
size--;
if (prev == e)
tab[i] = next;
else
prev.next = next;
return e.value;
}
prev = e;
e = next;
}

return null;
}

可以看出,该方法首先获取 Entry<K, V> 的数组通过调用 getTable()方法。每次调用 getTable() ,另一种方法expungeStaleEntries()叫做。这个特殊的方法将使用 ReferenceQueue<Object>保持清除 WeakEntries并从 Entry<K, V>[] table 中删除过时的条目 。该方法的代码片段如下:

/**
* Expunges stale entries from the table.
*/
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
@SuppressWarnings("unchecked")
Entry<K,V> e = (Entry<K,V>) x;
int i = indexFor(e.hash, table.length);

Entry<K,V> prev = table[i];
Entry<K,V> p = prev;
while (p != null) {
Entry<K,V> next = p.next;
if (p == e) {
if (prev == e)
table[i] = next;
else
prev.next = next;
// Must not null out e.next;
// stale entries may be in use by a HashIterator
e.value = null; // Help GC
size--;
break;
}
prev = p;
p = next;
}
}
}
}

通过代码片段可以看出,每个Entry都被添加到WeakHashMap中。 ,将该条目存储在 queue 中(put(K, V)操作期间调用构造函数如下所示:

Entry<K,V> e = tab[i];
tab[i] = new Entry<>(k, value, queue, h, e);

),并且从 queue 中检索并删除相同的条目在删除操作期间。删除此值 Entry<K, V>设置为 null e.value = null ,稍后将被GC处理。是的,它对GC没有任何控制。就是这样WeakHashMap有助于丢弃带有键的映射值。

关于java - 弱 HashMap 在取消引用后会立即释放内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40909646/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com