Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内存不足数组错误_Java_Arrays_Out Of Memory - Fatal编程技术网

Java内存不足数组错误

Java内存不足数组错误,java,arrays,out-of-memory,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

我试图将大量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)
ArrayList A=新的ArrayList();
长[]B=新长[100000000];
对于(int i=0;i<100000000;i++)A.add(i);
对于(inti=0;i<100000000;i++)B[i]=(长)i;
//线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间
//位于java.lang.Integer.valueOf(未知源)

有没有其他简单的数据结构可以用来存储如此大量的long或integer?

如果在运行
java
时适当地使用
-Xmx
标志(有关更多信息,请参阅),可以增加堆的大小。这将允许您在需要时以可控的方式使用更多内存。据我所知,没有一种方法可以从程序本身中“请求”更多堆内存(类似于在C中运行sbrk()或mmap()系统调用)

正如我链接到的答案所说:

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

java-Xmx2048m-Xms256m

此外,您还可以使用“k”、“m”或“g”分别表示千字节、兆字节和千兆字节。 但是,除非使用64位JVM,否则不能超过1GB(即堆大小)


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

任何解决方案都取决于您试图做什么。例如,如果您只想遍历这些值,则可以声明一个
迭代器

迭代器myIterator=新迭代器(){ 私有长nextValue=0; @凌驾 公共布尔hasNext(){ 返回下一个值<100000000; } @凌驾 公共长廊(下){ 返回nextValue++; } @凌驾 public void remove(){抛出新的UnsupportedOperationException();} };
这样的解决方案具有
O(1)
内存使用率,因为它不需要存储超过下一个值的任何内容。但它可能不适合应用程序。

您的程序是否要求您存储long?如果您使用整数而不是long,那么无论哪种方式,您都可以存储更多的long,是什么要求您在一个数组中存储这么多long

其他解决办法:

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


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

是否有理由不只是给JVM一个更大的堆?大量的
long
/int`值将占用一定的内存,无论您使用什么样的数据结构-1亿个值,400 MB用于
int
s,800 MB用于
long
s。一个数组非常精简,你对堆大小的设置是什么?100密耳<代码>长度不是很大。要设置堆大小限制,请使用“-Xmx”java命令行选项。你想用这些做什么?您真的需要存储一个连续的整数列表吗?或者这是针对一个实际具有不太可预测的值(例如随机生成的值)的应用程序吗?当数组本身导致
OutOfMemoryError
时,这将毫无帮助。此外,我看不出创建一个附加对象如何帮助解决简单循环中的内存问题。这也不能回答问题,
迭代器
不是一个数据结构。但是您需要显式存储所有的long吗?在处理一次值之后,是否要重用它?如果不考虑OP试图做什么,我认为这可能是一个合理的解决方案。数组一次分配所有空间,因此如果数组出现OOM错误,这些问题无关紧要。“这可能是一个合理的解决方案”的错误问题。OP要求存储值,而不是迭代值。如果不需要显式存储值,则不需要首先分配数组。我认为OP足够聪明,可以不存储不需要存储的内容。如果您不确定OP想要什么,请发表评论而不是回答。您是对的,但值得一提的是,-Xmx2g只适用于64位JVM。
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(); }
};