This question already has an answer here:
Adjusting GC Overhead Exceeded parameters
                                
                                    (1个答案)
                                
                        
                2年前关闭。
            
        

我正在寻找用Java编写的程序,该程序将反复尝试计算,请注意它会耗尽内存,更改计算,然后重试直到成功。 (内存耗尽是不可避免的;总的来说,我的想法就像基因编程,在这种情况下,您无法始终提前告知生成的程序是否会耗尽内存。)因此,请看一下主循环来找出问题所在。内存错误。

以下简单的测试程序:

public static void main(String[] args) {
    HashMap<String, Integer> hashMap = new HashMap<>();
    for (int i = 0; i < 1000000000; i++) {
        hashMap.put(Integer.toBinaryString(i), i);
    }
    System.out.println(hashMap.size());
}


耗尽内存并按预期以未捕获的异常退出,但是这大约需要20分钟,其中大部分时间似乎是由垃圾收集器花费的时间,他们进行了英勇的努力来找到足够的内存以继续运行。

我该如何告诉垃圾收集器内存不足,并且应该更早放弃呢?

最佳答案

我不知道通知垃圾收集器有关内存不足的提前通知的特定方法

但是以下棘手的方法可以立即通知您有关内存不足错误的信息

为HashMap定义一个initialCapacity,您将在运行本身时遇到内存不足错误。

HashMap<String, Integer> hashMap = new HashMap<>(1000000000); // define initialCapacity
            for (int i = 0; i < 1000000000; i++) {
                  hashMap.put(Integer.toBinaryString(i), i);
            }
            System.out.println(hashMap.size());

10-06 03:15