1亿英寸的int数组应该是400 MB,对吗? 一个int = 4个字节
因此,如果我使用-Xmx1024m将VM设置为最大堆1024m,为什么此代码会失败:
public static void main(String[] args) {
int[] b = new int[100000000]; //100 mil = 400mb
System.out.println("ok");
int[] c = new int[100000000];
}
这是输出:
ok
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Main.main(Main.java:9)
解决方案 - 将其分解!
public static void main(String[] args) {
int[] a = new int[50000000]; //50 mil = 200mb
System.out.println("ok 1");
int[] b = new int[50000000];
System.out.println("ok 2");
int[] c = new int[50000000];
System.out.println("ok 3");
int[] d = new int[50000000];
System.out.println("ok 4");
}
答案 0 :(得分:3)
问题在于,当你创建这个int []时,它需要400mb的连续内存。基本上这意味着,您需要一个400mb内存的固体块才能使用。由于堆的碎片,它无法找到一个可靠的400mb内存块来使用。这就是为什么你在这种情况下会出现内存不足的错误。