JVM线上问题排查过程
如果线上出现问题故障(比如:内存溢出,CPU过高,系统假死)时,一般排查流程:
1. 在服务器上dump出应用信息文件(保留案发现场);
2.及时重启服务(首先要保证线上服务的可用性)。
3.分析代码和dump文件,找出问题。
4.修复代码问题,快速上线。
5.总结问题,避免下次再犯(向同事分享这次问题的过程)。
如何dump出Java应用问题文件?
一:找出系统中内存占用较大的对象;
1. 找出当前java应用pid:
命令:jps 或 jps -v 或 jps -l
2. 打印当前java堆中各个对象的数量,大小。(注:只看前10的,可以加 | head -10 )
命令:jmap -histo:live pid > /tmp/a.txt
二:找出占用CPU最高的线程;
1. 用top命令查看是否java应用的CUP过高;
2. jps -l 找出java应用的pid;
3. 然后找到最高的线程PID(比如:16813):top -Hp pid
4. 将16813转换成16进制,即41ad (tips: printf "%x" 16813 ) ;
5. 找出最忙的线程池名"xxx":jstack pid | grep '41ad'
tips:
A. 或直接dump出线程的信息文件:jstack -l pid > jstack.log
B. 如果使用spring-boot的话,直接在浏览器里查看/dump端点,也可以达到类似jstack的效果。
三:其它
1. 找出某个java应用打开的句柄数及线程数
ll /proc/{pid}/fd | wc -l 查看打开的句柄数
ll /proc/{pid}/task | wc -l 查看线程数
2. 使用jstat 查看GC情况
用法:jstat -gc pid 采样间隔毫秒数,比如: jstat -gc 9300 3000,将每隔3s采样一次pid为9300的gc情况
打印示例:
1 [stack@LO-U-JYB-SER01 ~]$ jstat -gc 9300 2000 2 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 3 18432.0 17920.0 3998.1 0.0 645632.0 447557.5 360960.0 254368.0 118488.0 111102.0 14592.0 13152.8 24 0.996 5 0.676 1.672 4 18432.0 17920.0 3998.1 0.0 645632.0 448243.3 360960.0 254368.0 118488.0 111102.0 14592.0 13152.8 24 0.996 5 0.676 1.672
标识说明:
1 S0C - 新生代中第1块survivor 的容量(Survivor 0 Capacity),KB单位 2 S1C - 新生代中第2块survivor 的容量(Survivor 1 Capacity),KB单位 3 S0U - 新生代中第1块survivor 已使用空间数(Survivor 0 Used),KB单位 4 S1U - 新生代中第2块survivor 已使用空间数(Survivor 0 Used),KB单位 5 EC - Eden区的容量(KB) 6 EU - Eden区已使用(KB数) 7 OC - Old区的容量(KB) 8 OU - Old区已使用(KB数) 9 MC - Metaspace容量(KB) 10 MU - Metaspace已使用KB 11 CCSC - 压缩类的内存容量(KB) 12 CCSU - 压缩类的已用容量(KB) 13 YGC - (从应用启动算起,到采样时的) Young GC次数 14 YGCT - (从应用启动算起,到采样时的) Young GC所用时间(秒) 15 FGC - (从应用启动算起,到采样时的) Full GC次数 16 FGCT - (从应用启动算起,到采样时的) Full GC所用时间(秒) 17 GCT - (从应用启动算起,到采样时的) Yong GC + Full GC的总时间

浙公网安备 33010602011771号