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)
下面是更简单的代码,可以更好地演示发生的情况:
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预留了部分堆用于错误处理或者错误处理不需要分配内存(分配发生在代码执行之前)。
| 归档时间: |
|
| 查看次数: |
2349 次 |
| 最近记录: |