java.lang.OutOfMemoryError: Java heap space

我在执行多线程程序时收到以下错误

java.lang.OutOfMemoryError: Java heap space

上述错误发生在其中一个线程中。

  1. 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行良好一段时间后会发生此错误,因为在创建对象时分配了例如变量的空间。

  2. 有没有办法增加堆空间?

  3. 我应该对我的程序进行哪些更改,以便它占用更少的堆空间?


答案 1

如果要增加堆空间,可以在命令行上使用。默认情况下,这些值基于 JRE 版本和系统配置。您可以在 Java 网站上找到有关 VM 选项的更多信息java -Xms<initial heap size> -Xmx<maximum heap size>

但是,我建议分析您的应用程序,以找出您的堆大小被占用的原因。NetBeans 附带了一个非常好的分析器。我相信它在引擎盖下使用了jvisualvm。使用探查器,您可以尝试查找创建许多对象的位置、对象何时被垃圾回收等。


答案 2

1.- 是的,但它几乎是指程序使用的整个内存。

2.- 是的,请参阅 Java VM 选项

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

java -Xmx2g为应用分配 2 GB 的最大 RAM

但是您应该先看看是否没有内存泄漏。

3.- 这取决于程序。尝试发现内存泄漏。这个问题很难回答。最近,您可以使用JConsole进行分析,以尝试找出您的内存将走向何方


推荐