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

问题现象

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

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

 

 


版权声明:本文为smilinggg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。