JVM调优 – 排查Java程序CPU100%问题

  • Post author:
  • Post category:java




找出CPU100%的线程

  1. 执行

    top -c

    ,显示进程运行信息的列表;按

    P

    , 进程按照CPU使用率排序,并找出CPU最高PID (如: PID – 3033 最高 )
  2. 找出消耗CPU最高的线程号

    top -Hp 3033

    ; 并按

    P

    , 进程按照CPU的使用率排序 (如:PID – 3034 的线程消耗CPU最高)
  3. 由于Java线程栈文件中的线程ID是十六进制,而top获得 PID是十进制,这里我们需要将十进制转换为十六进制,如下

    echo "obase=16;3034" | bc
    # 输出 `BDA`, 对应十六进制为: 0xbda
    



导出栈信息

  1. 根据进程PID导出线程栈快照,文件扩展名通常.tdump结尾

    jstack  -l 3033 > ./3033.tdump
    
  2. 查看导出文件,使用 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 版权协议,转载请附上原文出处链接和本声明。