5

我的目标:

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

现在

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

错误

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

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

有谁能够帮助我?

4

5 回答 5

8

这个错误意味着你的程序需要比你的 JVM 允许它使用的更多的内存!

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

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

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

于 2012-08-06T07:37:38.710 回答
5

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

100 多个线程太荒谬了——难怪您的应用程序正在爆炸式增长。

于 2012-08-06T07:33:21.410 回答
2

您也没有提供任何信息表明该问题与 StackOverflow 中给出的有关此错误的所有答案都非常不同;

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

我怀疑由于您希望 1000 个用户运行每个需要一个小时的进程,因此您可能需要比您拥有的更多的资源。例如 1000 个核心?我建议您根据以可接受的水平运行用户所需的 CPU、内存、磁盘 IO 和网络 IO 来查看需要多少硬件,例如 20 个用户和 50 个用户的倍数。

于 2012-08-06T07:33:58.103 回答
1

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

编辑:

例子:java -Xmx2g MyApp

于 2012-08-06T07:38:46.177 回答
1

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

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