背景:

生产环境, 项目cpu一直报警

进入容器查看cpu占用高的进程

top

查看占用cpu高的线程

top -Hp 90

这里得到占用资源高的线程, 假如是93

获取线程id的16进制

printf "%x\n" 93

这里得到的5d

对于只有jre的镜像, 需要安装对应版本jdk

然后打印堆栈信息

打印堆栈信息: ./jstack -l 90 > jstack.log

查找到对应线程的信息: cat jstack.log |grep "nid=0x5d"

查看gc

格式: jstat -gcutil pid interval(ms) n次

jstat -gcutil 90 5000 10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 99.64 100.00 94.39 92.31 285 14.940 474 329.694 344.635
0.00 0.00 98.78 99.99 94.40 92.31 285 14.940 475 330.548 345.489
0.00 0.00 99.21 99.99 94.40 92.31 285 14.940 475 330.548 345.489
0.00 0.00 99.74 99.99 94.40 92.31 285 14.940 475 330.548 345.489
0.00 0.00 98.82 99.97 94.41 92.31 285 14.940 476 331.283 346.223
0.00 0.00 99.31 99.97 94.41 92.31 285 14.940 476 331.283 346.223
0.00 0.00 99.73 99.97 94.41 92.31 285 14.940 476 331.283 346.223
0.00 0.00 98.75 99.98 94.42 92.31 285 14.940 477 331.935 346.875
0.00 0.00 99.18 99.98 94.42 92.31 285 14.940 477 331.935 346.875
0.00 0.00 99.56 99.98 94.42 92.31 285 14.940 477 331.935 346.875


S0: 新生代中Survivor space 0区已使用空间的百分比
S1: 新生代中Survivor space 1区已使用空间的百分比
E: 新生代已使用空间的百分比
O: 老年代已使用空间的百分比
P: 永久带已使用空间的百分比

YGC: 从应用程序启动到当前,发生Yang GC 的次数
YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
FGC: 从应用程序启动到当前,发生Full GC的次数
FGCT: 从应用程序启动到当前,Full GC所用的时间
GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

可以看到程序频繁在Full GC(老年代Full GC的时候会导致stop-the-world---中断所有用户线程)

导出堆栈hprof, 再利用mat软件查看

./jmap -dump:format=b,file=heap.hprof 90