项目总结53:Linux Java项目CPU过载问题分析
发现问题
因为项目部署在阿里云服务器上,登陆阿里云服务器,发现服务器CPU一直是100%使用;
问题分析
第一步:找到占用过多CPU进程,并找到对应的为题代码
- 1-登陆Linux服务器,使用TOP指令,找到占用CPU的进程;查找发现PID=31687,且是java项目
- 2- 使用ps aux | grep PID (ps aux | grep 31687)查看是那个java程序占用cpu 。根据文件目录位置确认就是自己部署的Java项目出问题了
- 3-ps -mp PID -o THREAD,tid,time (ps -mp 31687 -o THREAD,tid,time)显示线程列表,找出线程列表中占用cpu过高的tid (如tid=31687 ); | sort -rn -k2 | head -10 表示根据第二个参数倒序排序,且只展示前10个数据
- 4-printf "%x\n" tid (printf "%x\n" 32279)将其tid转化为16进制格式 如7e17
- 5-jstack PID | grep TID -A30(jstack 31687 | grep 7e17 -A30) 打印对应的堆栈信息,查看具体原因;对CPU占用排前10的问题,均是同一个问题,如下
第二步:分析代码问题
- 1-根据报的的异常推断,在创建session时,HashSet因为线程原因出现了死循环,参考:https://blog.csdn.net/gs_albb/article/details/88091808
解决问题
- 1-针对线程安全问题,对HashSet,使用Collections.synchronizedSet(sessionSet)进行同步处理
HashSet<HttpSession> sessionSet=(HashSet<HttpSession>) context.getAttribute("sessionSet"); Set<HttpSession> httpSessions = Collections.synchronizedSet(sessionSet); if(httpSessions==null){ httpSessions=new HashSet<HttpSession>(); context.setAttribute("sessionSet", httpSessions); }