我需要一个比最大堆空间更大的数组

时间:2015-09-07 23:01:57

标签: java arrays heap

我正在编写一个程序,需要一个包含5亿个元素的整数数组。但是,我的最大堆空间太小。我不能将它拆分为许多较小的数组,一次使用一个或增加我的堆大小。我该怎么办?

1 个答案:

答案 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时,它仍然失败。