【问题标题】:OutOfMemoryError on 10000x10000 int array in eclipseeclipse中10000x10000 int数组上的OutOfMemoryError
【发布时间】:2011-08-11 16:25:06
【问题描述】:

我写了一个小程序来检查按行或列循环遍历二维数组的时间,因为我记得一种方法对于大型数据集要快得多,但我不记得哪种方法了。不过,当我运行我的程序时,我遇到了一个有趣的错误。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at testing.ForLoopTest.main(ForLoopTest.java:10)

现在在我的测试中,我使用了一个 int[10000][10000],它在 eclipse 中运行,具有默认的堆设置。我知道我可以增加堆大小,但我的直觉告诉我这应该运行得很好,而我不需要这样做。这是正常的吗?我的代码中是否有一些我没有看到的愚蠢的东西?

这是我的代码

public static void main(String[] args){
    final int arrSize = 10000;
    long start = 0;
    long rowFirstTime = 0;
    long colFirstTime = 0;
    int[][] arr = new int[arrSize][arrSize];

    start = System.currentTimeMillis();
    for(int x = 0; x < arrSize; x++){
        for(int y = 0; y < arrSize; y++){
            arr[x][y] = -1;
        }
    }
    rowFirstTime = System.currentTimeMillis() - start;
    start = System.currentTimeMillis();
    for(int y = 0; y < arrSize; y++){
        for(int x = 0; x < arrSize; x++){
            arr[x][y] = 0;
        }
    }
    colFirstTime = System.currentTimeMillis() - start;
    System.out.println("row time is " + rowFirstTime);
    System.out.println("col time is " + colFirstTime);
}

错误发生在数组初始化时,它没有进入 for 循环。

谢谢, zdevex

【问题讨论】:

  • 您正在使用 100,000,00(1 亿)个整数,您确定默认堆大小会支持吗?

标签: java arrays heap-memory


【解决方案1】:

您正在尝试为 10 000 个长度为 10 000 的数组分配内存。这需要大量内存(根据原始计算,大约 400 MiB),这些内存在您的 JVM 中不可用。这会导致您的OutOfMemoryError

尝试在执行参数中增加分配给 JVM 的内存量。您正在查看类似 -Xmx 参数的内容。尝试给它一个大于 400 MiB 的值。我认为您可以在 Eclipse 的项目属性中更改此值。

【讨论】:

  • 接近 380 MB。但是,是的,我怀疑默认情况下堆有那么大。
  • @Grimace:原始计算,我不认为确切的值很有趣,一行数量级足以理解问题:) 是的,380 Mb 无论如何都不适合。跨度>
  • 这是有道理的。我想我没有想到这一点。谢谢!
  • 默认的最大内存大小是 Java 6 服务器 JVM 中总物理内存的百分比。在我的 PC 上,默认值为 6 GB。我还使用-mx 作为它的较短;)
【解决方案2】:

10,000 * 10,000 * 4 字节 = 400,000,000

不,这 4 亿字节不适合默认堆空间!

【讨论】:

    【解决方案3】:

    我认为您的直觉是错误的,并且 10000 * 10000 *(int 大小)字节大于您的默认堆大小。

    【讨论】:

      【解决方案4】:

      让我们看看...10,000 乘以 10,000 = 100,000,000。每个整数四个字节使您达到 400,000,000 个字节。加上 10,000 个数组元素的一些开销。你认为分配半 GB 应该“运行得很好”而不对堆大小做任何事情?

      【讨论】:

        【解决方案5】:

        一个 int 占用 4 个字节。

        10000 * 10000 * 4 字节 = 400000000 字节 ~= 381 MB。并且您必须添加数组所占用的大小。

        如果你的堆大小小于这个值,那么你需要增加堆大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-14
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          相关资源
          最近更新 更多