一、使用場景 當一個java應用CPU的使用比較高或者到達100%以上的時候,需要分析代碼哪裡有問題。這時候可以使用jstack命令 二、怎麼使用 先使用命令ps –ef |grep keyword 找到應用的進程號,用PID表示。 然後使用命令導出當前的堆棧,命令如下 jstack 23000 > ...
一、使用場景
當一個java應用CPU的使用比較高或者到達100%以上的時候,需要分析代碼哪裡有問題。這時候可以使用jstack命令
二、怎麼使用
先使用命令ps –ef |grep keyword 找到應用的進程號,用PID表示。
然後使用命令導出當前的堆棧,命令如下
jstack 23000 > 1.log (23000為進程號,重定向到1.log文件)
查找cpu使用率最高的線程號,一個進程中有很多的線程(23000為進程號)
使用命令:
ps -mp 23000 -o THREAD,tid
得到如下結果:
USER %CPU PRI SCNT WCHAN USER SYSTEM TID
app 2.0 19 - n_tty_ - - 24876
app 2.0 19 - futex_ - - 24879
app 1.9 19 - futex_ - - 24882
app 1.9 19 - futex_ - - 24885
app 1.9 19 - futex_ - - 24888
app 0.0 19 - futex_ - - 24916
app 97.3 19 - - - - 24917
app 0.0 19 - futex_ - - 24918
app 0.0 19 - futex_ - - 24919
app 0.0 19 - futex_ - - 24920
app 0.0 19 - futex_ - - 24921
發現24917的線程使用率為97.3
使用linux命令行工具
printf '%x' 24917
將10進位的24917轉化為16進位的6155,因為堆棧中的線程號都是用十六進位表示。
vi 1.log進入堆棧日誌搜索/6155結果如下
"changeService" prio=10 tid=0x00007f5158101000 nid=0x6155 runnable [0x00007f4f92dec000]
java.lang.Thread.State: RUNNABLE
at com.xxx.service.impl.ChangeServiceImpl.execute(ChangeServiceImpl.java:115)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
發現這裡的代碼可能有問題,通過定位,發現這邊寫了個死迴圈導致系統cpu使用率飆高。