为什么我得到java.lang.OutOfMemoryError?

时间:2015-03-19 12:55:31

标签: java out-of-memory heap-memory

我得到了:

java.lang.OutOfMemoryError : Java heap space
Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2894)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:407)
    at java.lang.StringBuilder.append(StringBuilder.java:136)

3 个答案:

答案 0 :(得分:1)

不管你运行的是什么平台,你总是要使用有限的最大堆。在Windows 32位中,这大约是2GB(不是专门的堆,而是每个进程的总内存量)。恰好,Java恰好使默认设置更小(大概是因为程序员无法创建具有失控内存分配的程序而不会遇到这个问题并且必须仔细检查他们正在做什么)。

因此,您可以采用多种方法来确定所需的内存量或减少所使用的内存量。垃圾收集语言(如Java或C#)的一个常见错误是保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象具有对它们的引用,它们将继续使用堆空间,因为垃圾收集器不会删除它们。

在这种情况下,您可以使用Java内存分析器来确定程序中的哪些方法正在分配大量对象,然后确定是否有办法确保它们不再被引用,或者不在它们中分配它们。第一名。我过去使用的一个选项是" JMP" http://www.khelekore.org/jmp/

如果由于某种原因确定要分配这些对象,并且需要保留引用(取决于您正在执行的操作,可能就是这种情况),您只需要在启动时增加最大堆大小程序。但是,一旦你进行了内存分析并了解了如何分配对象,你应该更好地了解你需要多少内存。

一般情况下,如果您无法保证程序将在某些有限的内存中运行(可能取决于输入大小),那么您将始终遇到此问题。只有在耗尽所有这些后才需要查看缓存对象到磁盘等。此时你应该有一个很好的理由说"我需要Xgb的内存"对于某些事情你可以通过改进你的算法或内存分配模式来解决它。通常情况下,只有在大型数据集(如数据库或某些科学分析程序)上运行的算法才会出现这种情况,然后缓存和内存映射IO等技术变得有用。

答案 1 :(得分:1)

OutOfMemoryError通常是由于VM没有足够的内存来运行项目引起的。您是直接从命令行运行它还是使用IDE?

例如,尝试通过添加-Xmx1G选项来运行您的程序,该选项将1Go内存堆分配给您的程序,您当然可以根据自己的需要进行调整。 G代表Go,m代表Mb。

答案 2 :(得分:1)

您应该为堆提供更大的工作量。