首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HashMap.clear()减少内存?

HashMap.clear()减少内存?
EN

Stack Overflow用户
提问于 2022-08-15 15:22:19
回答 2查看 147关注 0票数 2
代码语言:javascript
运行
复制
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。那么,为什么内存会减少呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-15 15:31:29

如果您是指this question's answers,则它们告诉您,HashMap中的条目数组(table)从未缩小过。相反,它的条目都设置为null

但是清除映射会使您创建的10万个字符串("key0""key1"、.)以及它们关联的Map.Entry对象是否符合垃圾收集的条件,尽管table没有变小。

票数 7
EN

Stack Overflow用户

发布于 2022-08-15 15:31:07

这是一个实现细节,因此具体的答案可能会根据Java的确切版本而改变。

以下是HashMap::clear的Java8实现

代码语言:javascript
运行
复制
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即可。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73363072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档