gpt4 book ai didi

java - 调用 Hashmap.remove() 后是否会立即进行垃圾回收?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:29 30 4
gpt4 key购买 nike

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);
}

i达到37553时,java.lang.OutOfMemoryError: Java heap space发生。
循环中似乎没有发生垃圾回收。
现在我想知道如何解决这个问题。

最佳答案

尝试按如下方式重写代码,你应该不会出现 OOME 的 ...

Random r = new Random(1234697890);
HashMap<Integer, List<Integer>> map = new 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);
}

您的原始代码的问题在于:

  • 你只创建一个列表,
  • 您不断向其中添加越来越多的元素,并且
  • 该列表只有在代码完成时才会变成垃圾……因为它一直都在“范围内”。

在循环内移动 list 声明意味着在每次循环迭代中创建并填充一个新的 ArrayList,并在您开始下一次迭代时变成垃圾。


有人建议调用 System.gc()。它对您的情况根本没有帮助,因为要收集的垃圾最少1。总的来说,这是一个坏主意,因为:

  • 保证 GC 在抛出 OOME 之前立即运行,
  • JVM 可以比您更好地判断何时是运行 GC 的最佳(即最有效)时间,
  • 您对 System.gc() 的调用可能会被完全忽略。可以配置 JVM,以便忽略对 System.gc() 的调用。

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

关于java - 调用 Hashmap.remove() 后是否会立即进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13723983/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com