java.lang.OutOfMemoryError:无法创建新的本机线程消息,但没有运行很多线程

时间:2016-08-14 16:37:02

标签: java tomcat jvm threadpool tcserver

在Linux服务器上运行带有不同Web应用程序的tc-server的6个java进程, 有时几个服务器因为这个错误而停止工作(几乎同时):

Exception in thread "ajp-bio-9096-Acceptor-0" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:162)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:142)
at org.apache.catalina.core.StandardThreadExecutor.execute(StandardThreadExecutor.java:169)
at org.apache.tomcat.util.net.JIoEndpoint.processSocket(JIoEndpoint.java:531)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:234)
at java.lang.Thread.run(Thread.java:745)

这会导致在一台计算机上运行的一个或多个JVM停止工作。 (我们在同一台机器上运行了6个tc服务器) 看起来我们的linux机器上达到了最大进程数。 OS-level is about 31389 (ulimit -u)上的最大线程数。但是我们在linux中看不到过多的线程 当我查看操作系统时,大约有1500个线程正在运行

(ps -eLF | wc -l)

在分析/监视tcserver进程时,每个java进程的线程数通常在50到150之间,并且在负载下可以进行 由于http-threads而导致350,但是这将会下降并且永远不会达到每个进程1000的最大线程数(在这台机器上)。

我们正在使用64 bit Java 1.7运行时环境,操作系统上总是有空闲内存。

今天我们甚至在服务器启动后1分钟收到此消息。 jvm停止工作,但os进程继续运行。 在查看此过程的线程数时,它是51.

(ps uH p <pid> | wc -l).

所以它看起来达到了最大线程数,但我们从未看到很多正在运行的线程。

1 个答案:

答案 0 :(得分:4)

我找到了问题的原因。

我用自己的用户检查了ulimit -u。那回报了31389。 而且我看不出为什么达到这个限制的原因。

但是在生产中,这些流程在另一个用户和该用户下运行 ulimit -u返回1024

这6台服务器默认状态为每台服务器50-150个线程, 因此,当临时加载一点时,tcserver中的线程数将达到1024的限制。

所以在linux中我们增加了生产用户的线程数,现在运行正常。