我正在模拟服务器的重载,我收到了这个错误:
java.lang.OutOfMemoryError: unable to create new native thread
我已在此页面http://activemq.apache.org/javalangoutofmemory.html中读到,我可以增加内存大小。但是我该怎么做?我需要修改哪个文件?我试图通过bin / activemq脚本传递参数,但没有运气。
答案 0 :(得分:10)
您的案例与massive number of threads相对应。 有3种方法可以解决它:
注意:如果堆栈或堆太小,则必须导致另一个 OutOfMemoryError 。
您可以使用 ACTIVEMQ_OPTS shell变量(在UNIX中)指定它们。 例如,将ActiveMQ作为
运行ACTIVEMQ_OPTS=-Xss160k bin/activemq
答案 1 :(得分:1)
您可以使用 -Xmx 命令参数为Java虚拟机分配更多内存
例如。 java -Xmx512M MyClass
答案 2 :(得分:1)
例如,为运行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的帖子已经解释了如何解决这个问题。