На сервере linux с 6 процессами java, выполняющими tc-сервер с различными веб-приложениями, иногда несколько серверов перестают работать (почти на в то же время) из-за этой ошибки: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)
Это приводит к тому, один или несколько JVM о том, что работают на 1 машину, чтобы перестать работать. (у нас есть 6 tc-серверов, работающих на одном компьютере) Похоже, что достигнуто максимальное количество процессов на нашей машине Linux. Максимальные потоки на OS-level is about 31389 (ulimit -u)
. Но мы не видим чрезмерное количество потоков в Linux Когда я смотрю на операционной системе имеется около 1500 потоков, выполняющихся
(ps -eLF | wc -l)
При профилировании/мониторинг tcserver обрабатывает количество потоков в процессе Java обычно между 50 и 150 и под нагрузкой, которая может идти до 350 из-за http-потоков, но это снизится и никогда не достигнет максимального количества потоков в процессе 1000 (на этой машине).
Мы используем среду выполнения 64 bit Java 1.7
, и в ОС всегда есть свободная память.
Сегодня мы получили это сообщение через 1 минуту после запуска сервера. Jvm перестала работать, но процесс os продолжал работать. При взгляде на количество нитей этого процесса было 51.
(ps uH p <pid> | wc -l).
Так это выглядит как максимальное количество потоков будет достигнуто, но мы никогда не видим много запущенных потоков.
Mind захватывает захват 'top', чтобы мы могли видеть, сколько памяти используется? –
То, что показывает: Задачи: 364 всего, 1 бег, 363 спальных мест, 0 остановок, 0 зомби Cпалты: 9.7% us, 5.9% sy, 0.0% ni, 83.4% id, 0.2% wa, 0.0% привет, 0.8% si, 0.0% st Мем: 8057304k всего, 7778672k, 278632k бесплатно, 476752k буферов Обмен: 1048572k всего, 0k использовано, 1048572k бесплатно, 1301448k кэшировано – Edwin
При взгляде на график использования памяти во времени мы всегда видим небольшая часть свободной памяти как в реальной памяти, так и в свопе. – Edwin