问题现象
操作系统宕机无响应,无法登入操作系统,重启服务器后恢复
系统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对象公共出来每次复用这个对象。
操作系统因pid达到上限导致宕机,WebLogic日志显示内存不足。排查发现中间件创建大量线程,其中多数处于等待状态。问题源于应用中newFixedThreadPool在循环调用中无限制创建线程池,引发资源耗尽。解决方案包括在方法尾部添加shutdown关闭线程池,并确保线程池对象的复用。
3591

被折叠的 条评论
为什么被折叠?



