引起:java.lang.OutOfMemoryError:Java堆空间

我的目标:

我想为1000个用户运行我的应用程序。

现在

我试图为100个用户运行。 在应用程序运行期间,我想为每个用户执行一些过程,每个用户至少需要一个小时,因此我每个用户使用一个线程。

错误

Caused by: java.lang.OutOfMemoryError: Java heap space

我试图找出这意味着什么,但我不确定如何解决它。

有谁能够帮我?

此错误意味着您的程序需要比JVM允许的内存更多的内存!

因此,您几乎有两种选择:

  1. 使用-Xmx选项增加允许程序使用的默认内存(例如1024 MB: -Xmx1024m
  2. 修改你的程序,以便它需要更少的内存,使用更少的大数据结构,摆脱程序中某些时候不再使用的对象

正如Peter Lawrey指出的那样,使用分析器来查看您的程序在这种情况下正在做什么通常是一个好主意。

使用具有有限数量的工作线程的生产者/消费者模式 。

100多个线程是荒谬的 – 难怪你的应用程序正在爆炸。

您没有提供任何信息表明问题与StackOverflow中有关此错误的所有答案都有很大差异;

  • 您使用的内存过多,需要使用内存分析器来减少内存。
  • 您将最大内存设置得太低,需要使用-mx-Xmx增加最大内存

我怀疑,因为您希望1000个用户运行每个需要一个小时的进程,您可能需要比您拥有的资源更多的资源。 例如1000芯? 我建议您根据CPU,内存,磁盘IO和网络IO来查看所需的硬件数量,这些硬件是以可接受的级别运行用户所需的,例如20个用户和50个用户。

您可以尝试在启动应用程序时增加JVM堆空间。 您可以尝试使用-Xmx2g将其设置为2GB。 如果您正在运行32位Java,我认为2GB可以达到最高,但如果您有64位JVM,您应该能够更高。

编辑:

示例: java -Xmx2g MyApp

出现内存不足错误时,我会检查2个区域

  1. 分配给JVM的内存是否足够,如果不是使用-Xmx增加它
  2. 彻底检查代码,超过90%的时间我发现错误,某些循环在某些边界条件下递归。