项目总结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-针对线程安全问题,对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);
        }
posted on 2020-01-14 17:31  我不吃番茄  阅读(433)  评论(0编辑  收藏  举报