java CPU 使用率过高的分析
1. 先找到Java的进程号
Linux下:
windows 下:
打开任务管理器,然后点击“查看”菜单,然后点击“选择列”,把pid勾上,然后就可以在任务管理器里面看到所有进程的pid了
2. 做dump (可选)
jdk自带的jstack工具可以查看jiava的线程信息,可以实时查看,也可以导出来。如果实时查看不方便可以先dump。
jstack 命令使用提示:
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
3. 找到里面是哪个线程占用率最高
Linux下:
用 top -H -p <pid> 查看该进程所有线程信息,找到占用率最高的那个
Windows下:
除了使用jvisualvm或者带上top-thread插件的jconsole之外,可以用Windows自己提供的三方工具—— Process Explorer v15.3
4. 找到里面是哪个线程占用率最高
得到占用率最高的线程ID后,要把它转成16进制
Linux下:
printf "%x\n" <pid>
Windows下:
自带的计算器可以提供该功能
5. 分析dump查找问题代码片
可以用 jstack <pid> | grep -A <tid> 来实时获取内存中该线程代码片,这里<tid>是第3步中得到的16进制的id
也可以在第2步中导出的dump里面查找第3步中得到的线程id的十六进制而找到代码片。
6. 更简单的办法
DK自带工具jvisualvm和jconsole是非常强大的。其中jvisualvm原声支持实时查看线程CPU使用情况。
启动jvisualvm,并查看目标java进程信息,然后选择Sampler -> CPU -> Thread CPU Time
如图:
2019-04-04 10-19-46屏幕截图.png