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之前立即运行, 1 – 我的学究者想指出map.put(i,list); map.remove(ⅰ);很可能生成一个很可能变成垃圾的Integer对象.但是,与无限增长的ArrayList对象相比,这是“鸡饲料”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |