У меня есть сервер Ubuntu 16.04.5, который запускает несколько приложений Java от имени пользователя root.Приложения регулярно (примерно каждые 30 минут до 1 часа) вылетают из OutOfMemoryError: unable to create new native thread
.Что-то, что я заметил, - то, что приложения не терпят крах в одиночку, но вместо этого происходит сбой нескольких приложений одновременно.
Я не знаю, что вызывает это, и у меня возникают проблемы с поиском того, что мне нужно изменить наисправить проблему.
Я проследил несколько статей об ошибке и рассмотрел несколько возможных причин, но, похоже, они не относятся к моей ситуации:
Исправлена скорость создания потока
Приложения регулярно создают потоки, но многие потоки тоже умирают.Это означает, что число одновременных потоков никогда не поднимается выше 10k.Я проверил, есть ли у меня проблема с созданием сбежавшего потока путем генерации дампов и подсчета потоков, но количество потоков никогда не превышает ранее упомянутые 10 тыс.
Увеличьте ограничения потоков ОС
Когда я запускаю ulimit -u
, он возвращает 1546669
.
Этого должно быть достаточно, верно?
Выделите больше оперативной памяти для машины
Я использую около 7 ГБ доступной 16 ГБ ОЗУ.Это мой вид htop:
Дополнительная информация
Версия Java:
Полная ошибкатрассировка стека ошибки:
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at de.domisum.lib.auxilium.util.java.ThreadUtil.createAndStartThread(ThreadUtil.java:126)
at de.domisum.lib.auxilium.util.java.ThreadUtil.createAndStartThread(ThreadUtil.java:114)
at de.domisum.lib.auxilium.run.RunNotifyOnTimeout.run(RunNotifyOnTimeout.java:32)
at de.domisum.lib.auxilium.util.ticker.Ticker.tickWithTimeout(Ticker.java:119)
at de.domisum.lib.auxilium.util.ticker.Ticker.run(Ticker.java:108)
at java.lang.Thread.run(Thread.java:748)
Дамп потока из приложения, пострадавшего от ошибки: Дамп потока
Журналы сборщика мусора: gc log1 gc log2 gc log3