【问题标题】:I need a larger array than max heap space我需要一个比最大堆空间更大的数组
【发布时间】:2015-12-03 12:02:24
【问题描述】:

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

【问题讨论】:

  • 您使用的是 32 位还是 64 位 JVM?在 32 位上,限制为 4GB,当您创建该大小的数组时已经达到该限制。 64 位允许您分配大量的该数量。
  • 为了让我们帮助提出可行的替代方案,您必须解释一下为什么您需要同时在内存中存储所有这些数字。
  • 我很确定我使用的是 64 位。我在 Program Files(x86) 中有一台 64 位计算机和 Java。我可能想出一种使用数组的方法,但是我已经编写了代码来使用它,它提高了计算速度。我使用数组中索引较低的元素来计算索引较高的元素。然后我循环遍历数组并将某些值相加。
  • 单个对象的大小限制可能在 2-4GB 左右,即使在 64 位 JVM 上也是如此
  • Program Files(x86) 适用于 32 位程序。

标签: java arrays heap-memory


【解决方案1】:

我刚刚使用以下测试程序在 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 仍然失败。

【讨论】:

  • 我用 -Xmx3g 运行它并得到错误错误发生在 VM 初始化期间无法为 3145728KB 对象堆保留足够的空间。不过我有 12 GB 的 RAM
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多