jstack工具介紹


一、使用場景

當一個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使用率飆高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM