在具有 6 个 java 进程的 linux 服务器上,运行具有不同 Web 应用程序的 tc-server,有时由于此错误,多个服务器停止工作(几乎同时):
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-servers)看起来我们的 linux 机器上的最大进程数已达到。上的最大线程数OS-level is about 31389 (ulimit -u)
。但是我们在 linux 中没有看到过多的线程当我查看操作系统时,大约有 1500 个线程在运行
(ps -eLF | wc -l)
在分析/监视 tcserver 进程时,每个 java 进程的线程数通常在 50 到 150 之间,并且由于 http 线程,负载可能会达到 350,但这会下降并且永远不会达到每个进程的最大线程数1000(在这台机器上)。
我们使用的是64 bit Java 1.7
运行时环境,操作系统上总是有空闲内存。
今天,我们甚至在服务器启动 1 分钟后收到了这条消息。jvm 停止工作,但 os 进程继续运行。查看此进程的线程数时,它是 51。
(ps uH p <pid> | wc -l).
所以看起来已经达到了最大线程数,但我们从来没有看到很多正在运行的线程。