我正在模拟服务器过载,但收到此错误:

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

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

有帮助吗?

解决方案

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

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

笔记: :如果栈或堆太小,一定会导致另一个 内存不足错误.

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

ACTIVEMQ_OPTS=-Xss160k bin/activemq

其他提示

点击此处

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top