2012-08-06 63 views
4

我的目标:产生的原因:java.lang.OutOfMemoryError:Java堆空间

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

NOW

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

错误

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

我一直试图弄清楚这是什么意思,但我真的不知道如何解决它。

任何人都可以帮助我吗?

+0

似乎使用更多的内存乌尔比你 – CloudyMarble 2012-08-06 07:32:58

回答

7

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

因此你很可能有两种选择:

  1. 增加你的程序是允许使用-Xmx选项来使用(例如1024 MB:-Xmx1024m)的默认内存
  2. 修改程序,使其需要较少的内存,使用较少的大数据结构,并摆脱那些在程序中某些点不再使用的对象

正如Peter Lawrey指出的那样,使用探查器查看wha你的程序在这种情况下做的通常是一个好主意。

4

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

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

+0

我同意你的观点,但我必须要注意的是100+的线程是不是可笑,事实上,如果检查线程和春天有个运行Tomcat /码头, Hibernate,可能你已经有了大约50-60个框架相关的线程。想想吧,在tomcat池默认配置的threadPool大小是200,这意味着100+线程绝对不是那么荒谬。这就是说,带有工作线程的生产者/消费者模式确实是合理的解决方案,除了使每个进程需要少于1小时,并且需要更少的堆或增加maxHeapSize本身。 – 2012-08-06 07:53:59

+0

@baba对不起,但100多个线程运行100%的CPU,每个小时最少1小时*是*可笑和不生产。对于CPU绑定处理,您希望大致没有比CPU更多的线程。 J2EE容器中的那些线程实际上都是睡着了,并且保留在那里只是为了保持状态,所以当它们(偶尔)醒来做工作时,它们可以立即响应。 – Bohemian 2012-08-06 12:36:28

+0

是的,100多个线程同时运行超过1-2秒已经疯了。我只是指出,如果其中大部分线程正在睡眠,那么100多个线程都没有问题,就像我在上面描述的框架中一样。 – 2012-08-06 13:51:19

1

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

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

我怀疑,既然你想在1000级的用户运行它需要一个小时处理每个你可能需要更多的资源比你有。例如1000核心也许?我建议您根据CPU,内存,磁盘IO和网络IO等需要的硬件来查看需要的硬件数量,以便以较高的级别运行用户。 20个用户,并通过50多个。

0

当您启动应用程序时,您可以尝试增加JVM堆空间。您可以使用-Xmx2g将它设置为2GB。如果您运行的是32位Java,我认为2GB的容量是可以达到的,但是如果您有64位的JVM,则应该可以更高。

编辑:

例子:java -Xmx2g MyApp

0

我将检查2个区时,有内存不足的错误

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