使用JBOSS EJB CLIENT重复出现“ OutOfMemoryError:无法创建新的本机线程”

时间:2019-04-05 09:46:50

标签: java linux multithreading jboss

在JBOSS EAP 6.4上调用EJB服务时,经常发生此错误,并且总是在EJBClientContext registerEJBReceiver / unregisterEJBReceiver上发生。这些方法都将可运行项提交到名为ejbClientContextTasksExecutorService的CachedThreadPool(Executors.newCachedThreadPool)中。 可以在类EJBClientContext中查看代码: https://raw.githubusercontent.com/wildfly/jboss-ejb-client/87aef56ab787f57a9508c6e2b0f876066ae464fe/src/main/java/org/jboss/ejb/client/EJBClientContext.java

我有一个JBOSS Client应用程序,它是一个批处理程序,它创建固定数量的20个线程(使用Executors.newCachedThreadPool),但是每个任务都调用一个使用EJBClientContext的CachedThreadPool的EJB远程对象。

在EJBClientContext的CachedThreadPool内部运行的线程数是未知的,但我检查了一些似乎足以满足要求的操作系统限制:

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 个答案:

答案 0 :(得分:1)

尝试分析您的应用程序。如果使用的是Oracle JDK,则可以创建flight recording,并使用JMC对其进行分析。这样,您就可以随着时间的推移进行良好的分析,直到出现错误为止。

还找到了一个不错的article。尝试将分析结果与之进行比较。