Java内存不足数组错误
我试图将大量long存储到数组中,但我的数组和ArrayList出现OOM错误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
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(); }
};