ActiveMQ OutOfMemory无法创建更多线程

时间:2009-11-27 13:28:00

标签: java activemq

我正在模拟服务器的重载,我收到了这个错误:

java.lang.OutOfMemoryError: unable to create new native thread

我已在此页面http://activemq.apache.org/javalangoutofmemory.html中读到,我可以增加内存大小。但是我该怎么做?我需要修改哪个文件?我试图通过bin / activemq脚本传递参数,但没有运气。

5 个答案:

答案 0 :(得分:10)

您的案例与massive number of threads相对应。 有3种方法可以解决它:

  • 减少线程数(即文档中 -Dorg.apache.activemq.UseDedicatedTaskRunner = false
  • 通过 -Xss 选项减少每线程堆栈大小(默认值:Win / Linux上32位Java为320 KiB,Win / Linux上为64位Java为1024 KiB,请参阅{ {3}})
  • reduce( not extend )堆大小 -Xmx 选项为每个线程堆栈腾出空间(ActiveMQ脚本默认为512 MiB)

注意:如果堆栈或堆太小,则必须导致另一个 OutOfMemoryError

您可以使用 ACTIVEMQ_OPTS shell变量(在U​​NIX中)指定它们。 例如,将ActiveMQ作为

运行
ACTIVEMQ_OPTS=-Xss160k bin/activemq

答案 1 :(得分:1)

您可以使用 -Xmx 命令参数为Java虚拟机分配更多内存 例如。 java -Xmx512M MyClass

答案 2 :(得分:1)

Check here

例如,为运行ActiveMQ的VM指定-Xmx参数 - Tomcat。

答案 3 :(得分:1)

我们在Linux(RedHat Enterprise 5)系统上遇到了这个问题,并发现在这个版本中/etc/security/limits.conf中的nprocs ulimit实际上控制了用户可以产生的线程数。

您可以使用ulimit -a命令查看此限制。

开箱即用时,软限制设置为100,硬限制设置为150,这远远低于运行现代App Server所需的线程数。 我们完全删除了这个限制,它为我们解决了这个问题。

答案 4 :(得分:0)

这看起来似乎没有堆空间,所以不要增加它(-Xmx选项)。相反,您的应用程序正在耗尽进程内存,并且减少堆空间将释放进程内存以供本机使用。问题是,为什么你要使用这么多的进程内存?如果你不使用JNI,你可能已经创建了太多的线程,并且habe的帖子已经解释了如何解决这个问题。