问题现象
操作系统宕机无响应,无法登入操作系统,重启服务器后恢复
系统Message日志中报错Couldn’t fork a new process --Cannot allocate memory,查看原因是由于pid达到Max值上线32768导致操作系统
上面只跑了一个中间件WebLogic日志中报错java.lang.OutOfMemoryError: unable to create new native threa
中间件为什么会创建那么多线程呢????
问题排查
根据系统命令pstree排查了另一条还未宕机的系统,该系统进程java(26522)发现存在11599个线程
通过Jstack 26522 命令发现,有11296个线程处于Waiting状态
进一步排查发现存在11236个名为pool-pid-thread-1
查看正在running的pool-pid-thread发现,该线程是应用里有用多线程方法,在做WebService传输
根据线程找到对应的开发代码
根据测试该线程在正确调用下,只会创建设定值,不会超出大小
例如:设置线程池里设置大小为5,跑50次,每次跑30秒他还是5个线程
但当写在方法里或循环里被一直调用,也就是会一直创建这个线程池
故障原因
应用中使用多线程方法newFixedThreadPool不合理导致线程池无限制的创建,最终导致进程号超过操作系统限制大小,系统发生宕机无响应
1、在方法尾部加上finally方法,使用shutdown关闭线程池
2、newFixedThreadPool的方法本身是没有问题的,就是不能写在了一个方法里或循环里一直被调用,否则pool就会被一直被创建,应该把newFixedThreadPool对象公共出来每次复用这个对象。