问题表现
应用启动几个小时后,死掉,临死前报错:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread
目前服务重启了,可以预见几个小时后,程序依然会挂。
字面意思是不能创建本地进程,内存满了。可能的原因有两个:一是,本地native内存满了,不足以创建新的线程;二是线程数超出了本地文件描述符(FD,Linux下一切皆文件)限制。
问题可能就出在某几行代码上,有几个小时的反应时间,说明这个业务并发并不高。
排查过程
1. xss设置 、操作系统native内存 、剩余栈内存,及操作系统线程限制
首先,服务器执行Top命令,关注Mem,used和free;关注服务进程RES、%MEM,记下当前量,监控半小时候做比较。
KiB Mem : 7747272 total, 1063088 free, 5605736 used, 1078448 buff/cacheKiB Swap: 4186108 total, 4186108 free, 0 used. 1777504 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9527 tomcat 20 0 8458412 5.165g 19016 S 5.6 69.9 886:48.03 jsvc
然后,看xss设置,如果设置过大,每个线程占用内存过多,可创建的线程就少,不了解运维最近是否改过,谨慎起见,看看: