System.gc();
System.out.println((Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1024/1024);// print 1M
Map map=new HashMap();
for(int i=0;i<100000;i++){
map.put("key"+i,"i");
}
System.gc();
System.out.println((Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1024/1024); //print 10M
map.clear();
System.gc();
System.out.println((Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory()));//print less than 1M
调用clear方法时,内存似乎减少了。然而,从其他答案来看,clear
方法似乎从未缩小HashMap
。那么,为什么内存会减少呢?
发布于 2022-08-15 15:31:29
如果您是指this question's answers,则它们告诉您,HashMap
中的条目数组(table
)从未缩小过。相反,它的条目都设置为null
。
但是清除映射会使您创建的10万个字符串("key0"
、"key1"
、.)以及它们关联的Map.Entry
对象是否符合垃圾收集的条件,尽管table
没有变小。
发布于 2022-08-15 15:31:07
这是一个实现细节,因此具体的答案可能会根据Java的确切版本而改变。
以下是HashMap::clear
的Java8实现
public void clear() {
Node<K,V>[] tab;
modCount++;
if ((tab = table) != null && size > 0) {
size = 0;
for (int i = 0; i < tab.length; ++i)
tab[i] = null;
}
}
桶表已完全清空,但表本身以及非默认容量被保留。
不管具体实现是什么,您都希望释放大量内存,因为"key"+i
创建的所有非内部字符串都有资格进行收集。
如果您真的关心将容量降回默认状态,那么只需使用一个新实例重新分配HashMap即可。
https://stackoverflow.com/questions/73363072
复制相似问题