Устранение нерегулярных ошибок OutOfMemoryError: невозможно создать новый собственный поток - PullRequest
0 голосов
/ 23 июня 2019

У меня есть сервер Ubuntu 16.04.5, который запускает несколько приложений Java от имени пользователя root.Приложения регулярно (примерно каждые 30 минут до 1 часа) вылетают из OutOfMemoryError: unable to create new native thread.Что-то, что я заметил, - то, что приложения не терпят крах в одиночку, но вместо этого происходит сбой нескольких приложений одновременно.

Я не знаю, что вызывает это, и у меня возникают проблемы с поиском того, что мне нужно изменить наисправить проблему.

Я проследил несколько статей об ошибке и рассмотрел несколько возможных причин, но, похоже, они не относятся к моей ситуации:

Исправлена ​​скорость создания потока

Приложения регулярно создают потоки, но многие потоки тоже умирают.Это означает, что число одновременных потоков никогда не поднимается выше 10k.Я проверил, есть ли у меня проблема с созданием сбежавшего потока путем генерации дампов и подсчета потоков, но количество потоков никогда не превышает ранее упомянутые 10 тыс.

Увеличьте ограничения потоков ОС

Когда я запускаю ulimit -u, он возвращает 1546669.

ulimit -u output

Этого должно быть достаточно, верно?

Выделите больше оперативной памяти для машины

Я использую около 7 ГБ доступной 16 ГБ ОЗУ.Это мой вид htop:

htop

Дополнительная информация

Версия Java:

java version

Полная ошибкатрассировка стека ошибки:

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

...