6

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

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

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

4

5 回答 5

11

您的情况对应于大量线程。有3种方法可以解决:

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

注意:如果堆栈或堆太小,它一定会导致另一个OutOfMemoryError

您可以使用ACTIVEMQ_OPTS shell 变量(在 UNIX 中)指定它们。例如,将 ActiveMQ 运行为

ACTIVEMQ_OPTS=-Xss160k bin/activemq
于 2009-11-27T14:06:35.937 回答
1

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

于 2009-11-27T13:34:14.097 回答
1

在这里检查

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

于 2009-11-27T13:43:06.640 回答
1

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

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

开箱即用,这被设置为 100 的软限制和 150 的硬限制,这与运行现代 App Server 所需的线程数相差甚远。
我们完全取消了这个限制,它为我们解决了这个问题。

于 2011-08-23T18:00:17.997 回答
0

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

于 2009-12-03T12:13:38.587 回答