我正在模拟服务器的过载,我收到了这个错误:
java.lang.OutOfMemoryError: unable to create new native thread
我已经阅读了这个页面http://activemq.apache.org/javalangoutofmemory.html,我可以增加内存大小。但是我该怎么做呢?我需要修改哪个文件,?我试图通过 bin/activemq 脚本传递参数,但没有运气。
我正在模拟服务器的过载,我收到了这个错误:
java.lang.OutOfMemoryError: unable to create new native thread
我已经阅读了这个页面http://activemq.apache.org/javalangoutofmemory.html,我可以增加内存大小。但是我该怎么做呢?我需要修改哪个文件,?我试图通过 bin/activemq 脚本传递参数,但没有运气。
您的情况对应于大量线程。有3种方法可以解决:
注意:如果堆栈或堆太小,它一定会导致另一个OutOfMemoryError。
您可以使用ACTIVEMQ_OPTS shell 变量(在 UNIX 中)指定它们。例如,将 ActiveMQ 运行为
ACTIVEMQ_OPTS=-Xss160k bin/activemq
您可以使用-Xmx命令参数为 Java 虚拟机分配更多内存。
例如。java -Xmx512M MyClass
例如,将参数指定-Xmx
给运行 ActiveMQ - Tomcat 的 VM。
我们在 Linux (RedHat Enterprise 5) 系统上遇到了这个问题,发现在这个构建中 nprocs ulimit/etc/security/limits.conf
实际上控制了用户可以生成的线程数。
ulimit -a
您可以使用命令查看此限制。
开箱即用,这被设置为 100 的软限制和 150 的硬限制,这与运行现代 App Server 所需的线程数相差甚远。
我们完全取消了这个限制,它为我们解决了这个问题。
这看起来不像是堆空间用完了,所以不要增加它(-Xmx 选项)。相反,您的应用程序正在耗尽进程内存,减少堆空间将释放进程内存以供本机使用。问题是,为什么要使用这么多进程内存?如果你不使用 JNI,你可能创建了太多线程,habe 的帖子已经解释了如何解决这个问题。