用於快速排查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
