image

排查Java程序CPU占用原因

1.排查JAVA程序CPU占用高的原因

一、找到进程ID

TOP

二、找到Java高占用线程ID

ps -mp 30300 -o THREAD,tid | sort -r

如果占用CPU高的线程没有id,说明是主线程,可能是OOM导致的GC,排查是否存在gc overhead异常或分析dump包

三、线程ID转16进制

printf "%x\n" 19481<线程ID>

四、查找堆栈信息

jstack <进程ID> |grep <16进制线程ID> -A 50

2.导出并分析dump包

导出dump包

  • 自动导出:增加jvm启动参数-XX:HeapDumpPath=/opt/gc/xxx.dump -XX:+HeapDumpOnOutOfMemoryError

  • 手动导出:jmap -dump:live,format=b,file=/opt/gc/heap.dump <进程ID>

利用jhat分析dump包

  1. 启动jhat服务:jhat -port 7000 /opt/gc/heap.dump
  2. 访问web地址:http://127.0.0.1:7000,查看类实例直方图 http://localhost:7000/histo/ 分析哪个实例最多。