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

时间:2012-08-06 07:30:23

标签: java multithreading operating-system threadpool

我的目标:

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

立即

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

错误

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

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

有人能帮助我吗?

5 个答案:

答案 0 :(得分:7)

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

因此,你几乎有两个选择:

  1. 使用-Xmx选项增加允许程序使用的默认内存(例如1024 MB:-Xmx1024m
  2. 修改程序,使其占用更少的内存,使用较少的大数据结构,并删除程序中某些时候不再使用的对象。
  3. 正如Peter Lawrey指出的那样,使用剖析器来查看你的程序在这种情况下所做的事情通常是一个好主意。

答案 1 :(得分:4)

使用具有有限数量工作线程的producer/consumer pattern

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

修改

示例:java -Xmx2g MyApp

答案 4 :(得分:0)

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

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