#系统:centos7;openjdk:1.8;
1、简单介绍:
#1 若CPU100%,可能所有进程都不能正常干活(假死)
#2 Cpu100%出现情况:没有多余CPU切换(所有CPU均被占用,且不能被释放)
#3 Cpu100%出现条件:死循环、循环里无阻塞、只有计算型任务
注:System.out.println方法有IO,方法里有synchronized关键字、有阻塞。
2、CPU100%排查
#1 jcmd或jps获取当前异常进程pid
#注 centos7自带的openjdk1.8若没有jps等命令,可自行安装openjdk1.8的开发版
#2 获取进程pid的线程运行情况
top -H -p pid
找到cpu占用最高(异常)的线程,记录id
#3 获取进程pid的堆栈信息并存进log文件
jstack pid > tem.log
#4 将第2步获取的id转换成十六机制,并在第3步的tem.log文件里查找该进程号,由此锁定异常API,再具体分析代码
注:synchronized引起的死锁会被jstack pid直接分析出deadlock,因为synchronized关键字是jvm提供的,做了优化。
3、请求程序异常情况分析
#1 完全不响应:很有可能deadlock
#2 响应较慢:用jstack排查
#3 排查思路,例如2s不响应算是不太合理算是比较慢:
a、将2s之前jstack生成log和2s之后jstack生成log进行对比,查看线程在还是不在,在的话,查看为什么还没执行完
注:tomcat不太适用,因为tomcat里是线程池,thread可以复用
b、针对tomcat:观察前后2份log的相关方法调用栈,基本没变化可以说明thread没干活;如果大多数thread有问题,基本说明有问题


发布评论