JVM在内存不足错误期间的行为?List s = new ArrayList <String>();

Rek*_*kha 7 java

try {
    for(;;) {
        s.add("Pradeep");
    }
} finally {
    System.out.println("In Finally");
}
Run Code Online (Sandbox Code Playgroud)

在try块中,jvm耗尽了内存,那么jvm在没有内存的情况下如何最终激活块?

输出:

In Finally
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 1

下面是更简单的代码,可以更好地演示发生的情况:

    try {
        int[] a = new int[Integer.MAX_VALUE];
    } catch( Exception e ) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

数组分配失败,但这并不意味着 Java 不再有可用内存。如果将项目添加到列表中,列表会跳跃式增长。有时,该列表将需要 VM 一半以上的内存(默认情况下约为 64MB)。下一个添加将尝试分配一个太大的数组。

但这意味着虚拟机仍有大约 30MB 未使用的堆可供其他任务使用。

如果您想让虚拟机陷入麻烦,请使用 a,LinkedList因为它会线性增长。当最后一次分配失败时,将只有很少的内存来处理异常:

    LinkedList<Integer> list = new LinkedList<Integer>();
    try {
        for(;;) {
            list.add(0); 
        }
    } catch( Exception e ) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

该程序需要更长的时间才能终止,但它仍然会因错误而终止。也许Java预留了部分堆用于错误处理或者错误处理不需要分配内存(分配发生在代码执行之前)。