Java 我需要一个大于最大堆空间的数组

Java 我需要一个大于最大堆空间的数组,java,arrays,heap,Java,Arrays,Heap,我正在写一个程序,需要一个包含5亿个元素的整数数组。但是,我的最大堆空间太小。我无法将它拆分为许多较小的数组,并一次使用一个或增加堆大小。我能做什么?我刚刚使用以下测试程序在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;

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

我刚刚使用以下测试程序在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]);
    }
}
太小了;进一步增加堆大小:

javac T.java && java -Xmx3G T 500000000

-> last value: 499999999
因此,要么您没有使用64位虚拟机,要么您没有请求保留足够的空间


编辑:无论如何,在我的机器上,我需要设置-Xmx2870M或更高以避免OOME。对于-Xmx2860M,它仍然失败。

您使用的是32位还是64位JVM?在32位上,限制为4GB,当您创建一个该大小的数组时,已经达到了4GB。64位允许您分配大量的数字。为了让我们帮助您提出可行的替代方案,您必须进一步解释为什么需要同时在内存中存储所有这些数字。我非常确定我使用的是64位。我有一台64位计算机和Java的程序文件(x86)。我可能会想出一种使用数组的方法,但我已经编写了使用它的代码,它提高了计算速度。我使用数组中索引较低的元素来计算索引较高的元素。然后,我循环遍历数组并添加某些值。单个对象的大小可能有限制,大约为2-4GB,即使在64位JVM上也是如此。程序文件(x86)用于32位程序。我使用-Xmx3g运行它,发现在VM初始化期间发生错误,无法为3145728KB对象堆保留足够的空间。我有12G的内存
javac T.java && java -Xmx3G T 500000000

-> last value: 499999999