微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 调用Hashmap.remove()后立即发生垃圾收集?

Java代码如下:
Random r = new Random(1234697890);
HashMap<Integer,List<Integer>> map = new HashMap<Integer,List<Integer>>();
List<Integer> list = new ArrayList<Integer>();

for(int i=0;i<100000;i++){
    for(int j=0;j<1000;j++){
        list.add(r.nextInt(100000));
    }
    map.put(i,list);
    map.remove(i);
}

当我到达37553时,java.lang.OutOfMemoryError:Java堆空间发生.
似乎垃圾收集不会在循环中发生.
现在我想知道如何解决这个问题.

解决方法

尝试重写代码如下,你不应该得到OOME的…
Random r = new Random(1234697890);
HashMap<Integer,List<Integer>>();

for(int i=0;i<100000;i++){
    List<Integer> list = new ArrayList<Integer>();
    for(int j=0;j<1000;j++){
        list.add(r.nextInt(100000));
    }
    map.put(i,list);
    map.remove(i);
}

原始代码的问题是:

>你只创建一个列表,
>你不断添加越来越多的元素,和
>该代码只在代码完成时变为垃圾…因为它一直在“范围内”.

在循环中移动列表声明意味着在每次循环迭代中创建并填充新的ArrayList,并在开始下一次迭代时变为垃圾.

有人建议调用System.gc().在你的情况下它根本没有帮助,因为要收集minimal1垃圾.总的来说,这是一个坏主意,因为:

> GC保证在抛出OOME之前立即运行,
>当运行GC的最佳(即最有效)时间时,JVM可以比您更好地计算出来,
>无论如何,您对System.gc()的调用可能完全被忽略.可以配置JVM以便忽略对System.gc()的调用.

1 – 我的学究者想指出map.put(i,list); map.remove(ⅰ);很可能生成一个很可能变成垃圾的Integer对象.但是,与无限增长的ArrayList对象相比,这是“鸡饲料”.

原文地址:https://www.jb51.cc/java/120890.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐