用於快速排查Java
的CPU
性能問題(top us
值過高),自動查出運行的Java
進程中消耗CPU
多的線程,並打印出其線程棧,從而確定導致性能問題的方法調用。
目前只支持Linux
。原因是Mac
、Windows
的ps
命令不支持列出進程的線程id
,更多信息參見#33,歡迎提供解法。
PS,如何操作可以參見@bluedavy的《分布式Java應用》的【5.1.1 CPU
消耗分析】一節,說得很詳細:
top
命令找出消耗CPU
高的Java
進程及其線程id
:- 開啟線程顯示模式(
top -H
,或是打開top
后按H
) - 按
CPU
使用率排序(top
缺省是按CPU
使用降序,已經合要求;打開top
后按P
可以顯式指定按CPU
使用降序) - 記下
Java
進程id
及其CPU
高的線程id
- 開啟線程顯示模式(
- 查看消耗
CPU
高的線程棧:- 用進程
id
作為參數,jstack
出有問題的Java
進程 - 手動轉換線程
id
成十六進制(可以用printf %x 1234
) - 在
jstack
輸出中查找十六進制的線程id
(可以用vim
的查找功能/0x1234
,或是grep 0x1234 -A 20
)
- 用進程
- 查看對應的線程棧,分析問題
查問題時,會要多次上面的操作以分析確定問題,這個過程太繁瑣太慢了。
轉自:https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads