6回复
1年前
Java应用如何解决线程数逐渐增多导致OutOfMemoryError?
当前应用中正常情况下都是300左右个线程在跑,运行一段时间(一般为一两天,有时是几小时不定)之后,线程数开始逐渐增加,到2000左右抛出java.lang.OutOfMemoryError: unable to create new native thread错误,系统中线程很多,如何才能排查定位到问题所在?
3137 阅读
当前应用中正常情况下都是300左右个线程在跑,运行一段时间(一般为一两天,有时是几小时不定)之后,线程数开始逐渐增加,到2000左右抛出java.lang.OutOfMemoryError: unable to create new native thread错误,系统中线程很多,如何才能排查定位到问题所在?
我们线上也出现过线程数激增的问题,这种问题一般是由代码导致的,如果是业务代码或者框架代码,最好用线程池创建,并且指定线程名称,如果再出问题,直接把线上的线程Dump打下来,然后分析看看是哪个线程一直创建,再具体到代码层面。
这个问题是已经超出了操作系统的线程数的大小限制,你可以使用jdk提供的工具进行分析。
1.如果你具有生产环境的操作权限,那么你可以直接使用命令行dump具体的线程查询那些线程
2.如果是没有权限的话,那么在项目启动参数中加上-XX:+HeapDumpOnOutOfMemoryError参数,将OOM时候的堆栈信息dump出来。然后scp到本地服务器,进行分析即可。
jstack -l <pid> 看下线程名称 一般如果是框架创建的线程都是有固定格式的,
如果确实是需要这么多线程可以修改允许用户最大进程(含线程)数
ulimit -u 32000