Java Out of Memory Array错误

时间:2014-06-30 22:20:43

标签: java arrays out-of-memory

我正在尝试将大量的long存储到数组中,但是我的数组和ArrayList出现了OOM错误。

    ArrayList<Long> A = new ArrayList<Long>();
    Long[] B = new Long[100000000];

    for(int i = 0; i < 100000000; i++) A.add(i);        
    for(int i = 0; i < 100000000; i++) B[i] = (long) i;

//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//at java.lang.Integer.valueOf(Unknown Source)

我是否可以使用其他简单的数据结构来存储如此大量的long或整数?

3 个答案:

答案 0 :(得分:1)

如果您在运行-Xmx时适当使用java标记(有关详细信息,请参阅here),您可以增加堆大小。这将允许您在需要时以受控方式使用更多内存。据我所知,没有一种方式可以问&#34;从程序本身获取更多堆内存(类似于在C中运行sbrk()或mmap()系统调用)

我联系的答案是:

  

例如,像这样启动JVM将以256MB的速度启动它   内存,并允许进程使用多达2048MB的内存:

     

java -Xmx2048m -Xms256m

此外,您可以使用&#34; k&#34;,&#34; m&#34;或&#34; g&#34;分别为Kilobytes,Megabytes和Gigabytes。 但是,除非使用的是64位JVM,否则不能超过1GB(堆大小)。

如果您do the math使用特定用例,假设64位长* 100000000需要大约800MB的空间。

答案 1 :(得分:1)

您的计划是否要求您存储多头?如果你使用Integers而不是longs那么你可以存储更多,无论哪种方式,需要你在数组中存储这么多long?

其他解决方案:

当您使用参数-Xmx2G启动程序时,可以为程序提供更多堆空间 或其他长度大于标准512M或1G

您可以处理较少数量的数组值,然后将阵列保存到硬盘驱动器。然后处理数组的其余部分并将其存储到文件中。(需要基本的Java垃圾收集知识)

答案 2 :(得分:-1)

任何解决方案都取决于您尝试做什么。例如,如果您只想迭代值,则可以声明Iterator<Long>

Iterator<Long> myIterator = new Iterator<Long>() {
  private long nextValue = 0;

  @Override
  public boolean hasNext() {
    return nextValue < 100000000;
  }

  @Override
  public Long next() {
    return nextValue++;
  }

  @Override
  public void remove() { throw new UnsupportedOperationException(); }
};

这样的解决方案具有O(1)内存使用率,因为它不需要您存储超过下一个值的任何内容。但它可能不适合该应用程序。

相关问题