【问题标题】:Getting out of memory exception while creating 2 Dimensional int array创建二维 int 数组时出现内存不足异常
【发布时间】:2014-06-09 09:52:29
【问题描述】:

我有:

int [][] lengths=null;

我必须根据运行时参数来初始化它。

当我的数组大小类似于int[13000][130000] 或更大时,我得到OutOfMemoryException

有没有办法解决这个问题或我可以采取任何其他方法?

【问题讨论】:

  • 增加堆大小。看看stackoverflow.com/questions/6452765/…
  • 堆大小是多少?数组需要连续的内存,因此 JVM 可能无法为此数组分配 13000*130000*32 字节(在 java 中存储 int 所需的内存)。因此,它抛出了 OutofMemoryException。首先是检查是否需要这个巨大的数组,如果需要增加 JVM 堆。
  • 您将需要 13000*130000*4 字节来存储您的数组(如果您没有忘记第一个数字中的 0),这大约是 6.3Gb,您将需要更多空间来让您的其余部分程序工作。恐怕增加你的JVM的内存还不够,这么大的数组有什么用?

标签: java arrays performance


【解决方案1】:

一个整数占用 4 个字节的内存。你想分配4 Byte * 13000 * 130000 = 6760000000 Byte。那是约 6.5 GB 的内存。

如果您的计算机有这么多内存,则存在 JVM 参数来增加 JVM 使用的最大值。

【讨论】:

    【解决方案2】:

    如果您不是绝对需要填充此网格的每个单元格,nested lists 可能是一种更聪明的方法。把它想象成一个充满各种大小的一维数组的一维数组。作为一种数据类型,它们对于运行时提供的值特别有用,因此如果您不想或不允许按照 Salahs 回答中所述增加内存上限,请考虑将其作为替代方案。

    【讨论】:

      【解决方案3】:

      注意:这不应阻止OutOfMemoryError,但您需要了解JVM 内存参数,因为它对任何情况都有帮助。

      你需要看看JVM内存参数。实际上,您可以为 JVM 设置任意数量的内存:

      -Xmx2048m -> this param to set the max memory that the JVM can allocate
      -Xms1024m -> the init memory that JVM will allocate on the start up
      -XX:MaxPermSize=512M -> this for the max Permanent Generation memory
      

      您可能还想检查此参数。

      -XX:MaxNewSize=  -> this could be 40% from your Xmx value
      -XX:NewSize=614m -> this could be 40% from your Xmx value
      

      你也可以告诉你JVM 使用什么类型的GC(我认为它在早期版本中已经默认使用)

      -XX:+UseConcMarkSweepGC
      

      【讨论】:

        猜你喜欢
        • 2013-11-14
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        相关资源
        最近更新 更多