线上服务排查命令汇总

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: 永久带已使用空间的百分比

 

posted @ 2020-09-30 12:23  星火燎原智勇  阅读(27)  评论(0编辑  收藏