记一次Weblogic多线程导致系统宕机故障

操作系统因pid达到上限导致宕机,WebLogic日志显示内存不足。排查发现中间件创建大量线程,其中多数处于等待状态。问题源于应用中newFixedThreadPool在循环调用中无限制创建线程池,引发资源耗尽。解决方案包括在方法尾部添加shutdown关闭线程池,并确保线程池对象的复用。
摘要由CSDN通过智能技术生成

问题现象

操作系统宕机无响应,无法登入操作系统,重启服务器后恢复

系统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对象公共出来每次复用这个对象。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值