背景
天天搞java,這些監控也都知道,用過,但也沒往細里追究。因為也沒碰見這種問題,這次還是靜下來走一遍流程吧。與網上基本一致,不過我區分了下linux和windows的不一樣。我感覺基本是程序寫成死循環了或者大對象分配多了才有這種問題吧。
步驟
1.找到java進程對應的pid。通過任務管理器。linux---top
2.然后把java進程導出快照。直接運行命令。stack -l 31372 > c:/31372.stack
3.在windows下只能查看進程的cpu占用率,要查看線程的cpu占用率要借助其他的工具,我這里用的是微軟提供的 Process Explorer v15.3
右鍵點擊需要查看的進程---properties
linux下先輸入top,然后再按shift+h 或“H”,此時打開的是線程視圖,pid為線程號
4.然后選擇 Threads 選項卡,找到占用cpu的線程的tid,比如我這里是 31876 的線程
5.把pid轉換成16進制,我這里直接用系統自帶的計算器轉換,置於為什么要轉換,是因為先前用jstack導出的信息里面線程對應的tid是16進制的。
cmd---calc---計算器左上角選擇程序員,可進制轉換 。最后得到的線程pid的16進制的值為 7C84
6.在 c盤的31372.stack文件中查找 7C84
Thread-23" prio=6 tid=0x03072400 nid=0x1b68 runnable [0x0372f000]
java.lang.Thread.State: RUNNABLE
at com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)
at com.horn.common.OrderUtil.hisExp(OrderUtil.java:228)
at com.horn.util.MsgManage.receiveMsg(MsgManage.java:961)
at com.horn.util.PollMessageThread.run(PollMessageThread.java:74)
Locked ownable synchronizers: - None
