定位流程
先使用一些轻便的工具查看总体情况, 如果情况糟糕, 再使用重量级的工具
jstack 查看线程数是否过多
jstat -gc -gcutil 查看gc次数和时间是否过多, 各个分区中堆的实际大小。
FULL gc过多会造成STOP WORLD, 应用响应停顿。 考虑使用其他垃圾收集方式, CMS G1 ...
jmap -histo 显示各个类的个数和占用内存大小,查看是否的确占用很大===> 如果确实很大, 可能需要-dump堆; 如果不大,可能不是堆内存的问题
-histo:live会触发GC。 如果线上应用压力不大,可以使用;压力大时,考虑停用服务后再分析,慎用
jmap -dump:format=b,file=./xxx.dmp 注意file后面的存放路径。
命令执行不了, 可能是docker启动时没有设置ptrace=0, 也可能是用户不对, 也可能是file后面的存储路径没有权限
tar –czf xxx.tar.gz xxx.dmp 压缩dump文件
docker cp 将dmp copy到本地,使用eclipse MAT进行分析==> cpu 线程个数 锁 对象引用关系
命令解释:
jstat -options列出所有可选flag
-gc 显示内存中各个区的容量和实际占用大小
-gcutil 显示所有的内存统计百分比
其他选项
-class
-compiler
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-printcompilation
参考: https://blog.csdn.net/zhaozheng7758/article/details/8623549
https://lotabout.me/2018/QQA-Understanding-jstat-gc-output/
jmap
-heap to print java heap summary
-histo[:live]
-dump:<dump-options>
其他选项
-clstats to print class loader statistics
-finalizerinfo