首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.OutOfMemoryError:无法创建新的本机线程消息,但运行的线程不多

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

Stack Overflow用户
提问于 2016-08-15 00:37:02
回答 1查看 3.8K关注 0票数 2

在具有6个java进程的linux服务器上,tc-server运行不同的web应用程序,有时几个服务器会因为以下错误而停止工作(几乎同时):

代码语言:javascript
复制
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-server在同一台机器上运行)看起来已经达到了linux机器上的最大进程数。OS-level is about 31389 (ulimit -u)上的最大线程数。但我们在linux中没有看到过多的线程,当我查看操作系统时,大约有1500个线程在运行

代码语言:javascript
复制
(ps -eLF | wc -l)

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

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

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

代码语言:javascript
复制
(ps uH p <pid> | wc -l).

因此,看起来达到了线程的最大数量,但我们从来没有看到很多正在运行的线程。

EN

回答 1

Stack Overflow用户

发布于 2016-08-15 15:18:55

我找到了问题的原因。

我用自己的用户检查了ulimit -u。这将返回31389。我看不出达到这个限制的任何原因。

但是在生产环境中,这些进程在另一个用户下运行,对于该用户,ulimit -u返回1024

这6个服务器在默认状态下每台服务器有50-150个线程,所以当临时负载稍多一点时,tcserver中的线程数量将达到1024个的限制。

因此,在linux中,我们为生产用户增加了线程数量,现在它运行得很好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38944293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档