我正在编写一个程序,需要一个包含5亿个元素的整数数组。但是,我的最大堆空间太小。我不能将它拆分为许多较小的数组,一次使用一个或增加我的堆大小。我该怎么办?
答案 0 :(得分:2)
我刚刚在1.7.0_79 64位Linux上测试过类似的东西,使用以下测试程序:
class T {
public static void main(String args[]) {
int array[] = new int[Integer.parseInt(args[0])];
for (int i=1; i<array.length; i++) {
array[i] = array[i-1] + 1;
}
System.err.println("last value: " + array[array.length-1]);
}
}
它需要保留int数组的大小作为参数。通过我的背后数学,500M整数约为1.86GB(使用4字节整数),不考虑VM开销。所以要测试一下:
javac T.java && java -Xmx2G T 500000000
-> Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at T.main(T.java:3)
太小了;进一步增加堆大小:
javac T.java && java -Xmx3G T 500000000
-> last value: 499999999
因此,要么您没有使用64位VM,要么您没有请求足够的空间来保留。
编辑:为了它的价值,在我的机器上,我需要设置-Xmx2870M或更多以避免OOME。使用-Xmx2860M时,它仍然失败。