线上服务排查命令汇总
1、jps
jps主要用来输出JVM中运行的进程状态信息。常用参数命令:
jps -v
-
v
输出传入JVM的参数
2、jstack
jstack -l pid | jstack -m pid #-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 #-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
实际案例:
找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有:ps、top、printf、jstack、grep。假设我部署在服务器上的 java 应用名称为 searchrank。
1、找出对应服务 java 进程 pid = 76137
jps -v | grep searchrank
2、找出该进程内最耗费CPU的线程,可以使用命令:
top -Hp 7613
进入 top 命令界面中,根据标题提示例如:CPU、MEM、TIME,可以使用组合键:Shift + C/M/T 来指定按照各个维度进行倒排。
这里我就是通过组合键:Shift + T 将结果按照 使用 CPU 耗时最长 倒排。
3、得到对应线程 id 对应的十六进制值
printf "%x\n" 76404
最终得到的值为:12a74
4、轮到 jstack 上场了,用来输出对应线程堆栈信息
jstack 7613 | grep 12a74
从这里就可以看到 CPU 消耗的具体原因是什么了,它可以精确到对应源码行数,非常有用。
3、jmap 和 jhat
jmap用来查看堆内存使用状况,一般结合jhat使用。jmap 常用命令如下:
jmap -heap pid jmap -histo[:live] pid jmap -dump:format=b,file=dumpFileName pid
1. 使用 jmap -heap pid 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
2. 使用 jmap -histo[:live] pid 查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象。
3. jmap -dump:format=b,file=/tmp/dump.dat pid 用 jmap 把进程内存使用情况 dump 到文件中,再用 jhat 分析查看。
dump 出来的文件可以用 MAT、VisualVM 等工具查看,这里用 jhat 查看:
jhat -port 9998 /tmp/dump.dat #注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存 jhat -J-Xmx512m -port 9998 /tmp/dump.dat
然后就可以在浏览器中输入主机地址:9998查看了:
4、jstat
JVM统计监测工具,使用 -gc 打印出内存详情
# 指定 pid 输出对应 gc 信息,每 250ms 打印,一共打印 4 次 jstat -gc 21711 250 4
现在来解释各列含义:
EC、EU:Eden区容量 和 使用量
OC、OU:年老代容量 和 使用量
PC、PU:永久代容量 和 使用量
YGC、YGT:年轻代GC次数 和 GC耗时
FGC、FGCT:Full GC次数 和 Full GC耗时
GCT:GC总耗时
使用 -gcutil 会只列出对应空间占比 = 使用量/分配总量
jstat -gcutil 21711 250 4
解释一下上图中各个标题项中的含义:
S0: 新生代中Survivor space 0区已使用空间的百分比
S1: 新生代中Survivor space 1区已使用空间的百分比
E: 新生代已使用空间的百分比
O: 老年代已使用空间的百分比
P: 永久带已使用空间的百分比