GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
字體大小: +
2 分鐘閱讀時間 (361 個字)

當 Tomcat 將 CPU 占滿時該如何 Debug

Process Explorer 使用 Process Explorer 找出 tid

有時候因為程式撰寫邏輯問題,又或不小心,

經常會有 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

...

Process Explorer - Windows Sysinternals | Microsoft Docs

Find out what files, registry keys and other objects processes have open, which DLLs they have loaded, and more.

解壓縮後執行 procexp64.exe 後,直接有圖形介面可以看,

找到 java.exe 右鍵選擇 properties 後,

點選 threads 頁籤,就可以直接找到 tid 了。

×
Stay Informed

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.

每日小知識 #12 - Container 資安(3)
使用 Rest Client 來測試 api VS Code 擴充套件

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
2025年12月19日, 星期五

Captcha 圖像