有時候因為程式撰寫邏輯問題,又或不小心,
經常會有 CPU 滿載 100% 的狀況,
卻又不知該如何是好時,可以使用下列步驟來幫忙偵錯。
環境以 Tomcat 在 linux 上為例:
1. 先輸入 top 來找出 Tomcat 的 PID,假設找到的 PID 為 24603。
2. 再來使用 jstack -l 24603 >> jstack.log 來 dump jstack 的 log。
3. 接著使用 top -Hp 24603 觀察 Tomcat 內部的 thread 到底有哪些 pid 正在瘋狂的運作中。
4. 找到了幾個前幾名的 pid 如 731, 5869, 24864...
但這些 pid 還不能直接使用,
因為 jstack 內部存放的 log 是使用 16 進位,
所以要將這些數字轉換成 16 進位才可以知道他正在做甚麼事情,
以 731 來說, 轉換後為 2DB,
再回到 jstack 內搜尋 2DB,可以看到有一個 nid 叫做 0x2db,
這就是我們要找的目標了。
"http-nio-8080-exec-21" daemon prio=10 tid=0x000000000e7ad000 nid=0x2db runnable [0x000000004efad000] ... at java.util.regex.Pattern$Branch.match(Pattern.java:4502) at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) at java.util.regex.Pattern$BranchConn.match(Pattern.java:4466) at java.util.regex.Pattern$SliceI.match(Pattern.java:3895) at java.util.regex.Pattern$Branch.match(Pattern.java:4502) at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) at java.util.regex.Pattern$Branch.match(Pattern.java:4502) at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) at java.util.regex.Pattern$Bound.match(Pattern.java:5228) at java.util.regex.Pattern$Start.match(Pattern.java:3408) at java.util.regex.Matcher.search(Matcher.java:1199) at java.util.regex.Matcher.find(Matcher.java:592) at com.gss.activity.web.util.AutoLinkUtil.detectAndWrapLink(AutoLinkUtil.java:68) at com.gss.activity.web.util.AutoLinkUtil.transform(AutoLinkUtil.java:46) at com.gss.activity.web.common.JavascriptSanitizedLabel.getOutput(JavascriptSanitizedLabel.java:58) at com.gss.activity.web.common.JavascriptSanitizedLabel.onComponentTagBody(JavascriptSanitizedLabel.java:75)
這樣一來就不會大海撈針不知如何是好了。
如果是 Windows 環境可以下載一套微軟的軟體叫做 Process Explorer
解壓縮後執行 procexp64.exe 後,直接有圖形介面可以看,
找到 java.exe 右鍵選擇 properties 後,
點選 threads 頁籤,就可以直接找到 tid 了。
When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.
評論