Повторяющееся «OutOfMemoryError: невозможно создать новый собственный поток» с JBOSS EJB CLIENT - PullRequest
0 голосов
/ 05 апреля 2019

Эта ошибка часто возникает при вызове службы EJB в JBOSS EAP 6.4 и всегда происходит в EJBClientContext registerEJBReceiver / unregisterEJBReceiver. Оба эти метода передают исполняемый файл в CachedThreadPool (Executors.newCachedThreadPool) с именем ejbClientContextTasksExecutorService. Код можно просмотреть внутри класса EJBClientContext: https://raw.githubusercontent.com/wildfly/jboss-ejb-client/87aef56ab787f57a9508c6e2b0f876066ae464fe/src/main/java/org/jboss/ejb/client/EJBClientContext.java

У меня есть клиентское приложение JBOSS, которое представляет собой пакет, который создает фиксированное число из 20 потоков (с Executors.newCachedThreadPool), но каждая задача вызывает удаленный объект EJB, который использует CachedThreadPool EJBClientContext.

Число потоков, запущенных внутри CachedThreadPool EJBClientContext, неизвестно, но я проверил некоторые ограничения ОС, которые кажутся более чем достаточными:

nproc> 100000

ulimit -u> 100000

kernel.pid_max> 100000

/ proc / sys / kernel / threads-max> 150000

Я наблюдал за потреблением потоков на сервере в течение всего времени выполнения пакета с помощью следующей команды:

ps -A -o pid,nlwp,cmd

Количество потоков на процесс остается довольно низким (максимум 100 потоков на процесс, для 2 или 3 процессов одновременно).

1 Ответ

1 голос
/ 08 апреля 2019

Попробуйте профилировать вашу заявку. Если вы используете Oracle JDK, вы можете создать запись полета и проанализировать ее с помощью JMC . Затем у вас будет хороший анализ с течением времени, пока не произойдет ошибка.

Также нашел хорошую статью . Попробуйте сравнить с ним результаты анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...