找出CPU100%的线程
-
执行
top -c
,显示进程运行信息的列表;按
P
, 进程按照CPU使用率排序,并找出CPU最高PID (如: PID – 3033 最高 ) -
找出消耗CPU最高的线程号
top -Hp 3033
; 并按
P
, 进程按照CPU的使用率排序 (如:PID – 3034 的线程消耗CPU最高) -
由于Java线程栈文件中的线程ID是十六进制,而top获得 PID是十进制,这里我们需要将十进制转换为十六进制,如下
echo "obase=16;3034" | bc # 输出 `BDA`, 对应十六进制为: 0xbda
导出栈信息
-
根据进程PID导出线程栈快照,文件扩展名通常.tdump结尾
jstack -l 3033 > ./3033.tdump
-
查看导出文件,使用 grep 命令,查看线程 0xbda做了什么
cat 3033.tdump | grep 'bda' -C 8
导出堆信息
首先查看堆使用情况
jstat -gcutil 3033 1000
参数说明如下:
S0:
新生代中Survivor space 0区已使用空间的百分比
S1:
新生代中Survivor space 1区已使用空间的百分比
E:
新生代已使用空间的百分比
O:
老年代已使用空间的百分比
P:
永久带已使用空间的百分比
YGC:
从应用程序启动到当前,发生Yang GC 的次数
YGCT:
从应用程序启动到当前,Yang GC所用的时间【单位秒】
FGC:
从应用程序启动到当前,发生Full GC的次数
FGCT:
从应用程序启动到当前,Full GC所用的时间
GCT:
从应用程序启动到当前,用于垃圾回收的总时间【单位秒】
使用命令导出堆快照信息
jmap -dump:live,format=b,file=pid.hprof 3033
文件扩展名通常以hprof结尾。
使用 VisualVM 分析问题
可以使用 VisualVM 导入 线程栈快照文件(tdump) 或者 堆快照文件(hprof) 进行分析。
版权声明:本文为weixin_39123372原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。