Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断

  • IBM AIX Java

1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852

Name            PID  CPU%
java         614852  23.9
java         450806  20.5

  2. 使用命令 ps -mp <PID> -o THREAD 定位 CPU 使用高的线程 TID

比如下显示线程 (TID)11219165 消耗了 22% CPU.  把 11219165 换成 16 进制得到 AB30DD

ps -mp 614852 -o THREAD
    USER    PID   PPID       TID S  CP PRI SC    WCHAN        F     TT BND COMMAND
    wc90 614852 581756         - A 222  60 49        *   242001      -   - xxxxxxxxxxxx

-      -      -   4751559 R  20  95  1        -   400000      -   - -
       -      -      -  11219165 R  22  96  0        -   400000      -   - -

3. 获得 javacore 文件

通过命令 kill -3 <pid>, 比如 kill -3 614852

硬盘上 Java 工作目录 (一般是启动目录)会产生 javacore.20150507.163756.643532.0004

4. 搜索 TID, 比如 会得到线程的 Stack Trace, 然后可以定位消耗 CPU 的代码

  • Java 在 Linux 或者 Solaris

1. 和上面类似,不过使用下面命令得到消耗 CPU 的 进程 以及 里面的线程

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

Or

top -H  -p <pid>

2. 使用下面命令抓取 进程 thread dump, 然后结合上面的 PID (需要换成 16 进制),在 thread dump 里面搜索就可以找到

Jstack <pid>   > jstack.txt

上一篇:1135: 零起点学算法42——多组测试数据(求和)IV


下一篇:Java进阶(五十三)屡试不爽之正则表达式