在下面的代码中nameRef.get()
为 null ,之后name = null
and System.gc()
.
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) {
String name = new String("ltt");
WeakReference<String> nameRef = new WeakReference<>(name);
System.out.println(nameRef.get()); // ltt
name = null;
System.gc();
System.out.println(nameRef.get()); // null
}
}
WeakHashMap 是基于 WeakReference 的。最后,我想map.size()
将为 0。事实上,它是 1。
import java.util.WeakHashMap;
public class Main2 {
public static void main(String[] args) {
String name = new String("ltt");
WeakHashMap<String, Integer> map = new WeakHashMap<>();
map.put(name, 18);
System.out.println(map.size()); // 1
name = null;
System.gc();
System.out.println(map.size()); // it's 1. why not 0 ?
}
}
Java WeakHashMap什么时候会清理null
key?
简单的答案:你不知道。
含义:您无法控制 jvm 何时启动并触发 GC 周期。您无法控制何时实际收集符合条件的对象。
因此,您无法知道该地图的“状态”何时发生变化。
是的,另一部分是调用 System.gc() 只是建议 jvm 进行垃圾收集。在一个standard如果 jvm 遵循该请求或忽略它,则您的设置为零。例如,您需要使用非常特殊的 JVM 来改变这一点。
通常,gc 仅在 jvm 认为有必要时才运行。因此,只要内存不短缺,您的地图就可以将其大小保持为 1。并且作为answerHolger 很好地概述了即使 GC 运行也不会强制地图更新该部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)