1.问题描述:
启动springboot项目时候日志打印:“服务进程申请线程数量的限制”异常
2.问题分析:
(1)既然报“OutOfMemoryError”,而且还是“ unable to create new native Thread.”,那么很可能是程序申请的Thread数超过了系统能够承载的限制。但是作为一台性能还不错的服务器,不应该出现系统资源不够用。
(2)系统资源够用的话应该就看一下,是否超过了 OS 允许的 max user process?
(3)如果上面都不对的话,推测应该是OS中不再有足够的内存来 spawn 新的本地线程!
3.问题排查:
1.查看服务器未使用的空闲内存
free -h
结论:很显然内存是足够使用的,不会出现这种问题。
2.用ulimit命令查看一下系统的对进程资源的控制:
ulimit -a
max user processes的最大数为:100000,显然不是这个问题。
3.查看具体线程数:
top -H -p PID
分析:查看了该服务器发现线上数为4096,当前出问题的进程就占用了4013
1.这样就可以判断是堆栈占用的线程太多了
2.以上操作,发现对于当前定位意义并不大,具体问题出在了哪里,还是没有找出来。于是,尝试了另外打印堆栈的方式(kill -3 PID),堆栈信息打印在了catalina.out日志中,发现堆栈中尽然有4000多个相同线程
3.查看了一下业务逻辑中使用报错异常的位置
4.基本逻辑出问题的点,基本理论上已经定位清楚。
5.按照理论推断,进行了复现,根据实际情况修改bug!