異なるJavaアプリケーションでtc-serverを実行する6つのjavaプロセスを持つLinuxサーバーでは、 このエラーのために:java.lang.OutOfMemoryError:新しいネイティブスレッドメッセージを作成できませんが、多くのスレッドが実行されていません
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)
これにより、1台のマシンで実行されている1つ以上のJVMが動作を停止します。 (同じマシン上で6台のtcサーバーを実行しています) Linuxマシン上のプロセスの最大数に達したようです。 最大スレッド数はOS-level is about 31389 (ulimit -u)
です。しかし、我々は、私は、オペレーティングシステムを見てみるとプロファイリング/ tcserverを監視するJavaプロセスごとのスレッド数が間に通常で処理すると
(ps -eLF | wc -l)
を実行している約1500のスレッドがあるのlinux 内のスレッドの過剰な数が表示されません50、150、負荷の下ではhttpスレッドのために を350にすることができますが、これはダウンして、プロセスの最大スレッド数(このマシンでは1000)には達しません。
実行環境は64 bit Java 1.7
で、OSには常に空きメモリがあります。
今日、サーバーの起動から1分後にこのメッセージが表示されました。 jvmは動作を停止しましたが、osプロセスは動作し続けました。 このプロセスのスレッド数を見ると、それはそうスレッドの最大数に達しているように見えますが、私たちは、スレッドを実行しているの多くを見ることはありません51.
(ps uH p <pid> | wc -l).
ました。
「トップ」のキャプチャを取得して、使用されているメモリの量を確認できますか? –
以下を示します:タスク:364合計、1実行中、363スリーピング、0停止、0ゾンビ Cpu(s):9.7%sy、5.9%sy、0.0%ni、83.4%id、0.2%wa、0.0%hi、 0.835%si、0.0%st Mem:8057304k total、7778672k used、278632k free、476752kバッファー スワップ:1048572k総計、0k used、1048572k free、1301448kキャッシュ済み – Edwin
時にはメモリ使用量のグラフを見ると、実メモリとスワップの両方で小さな部分空きメモリ。 – Edwin