1. 程式人生 > >在Linux中找出佔用大量CPU的Java程式碼(將Java執行緒與Linux PID進行關聯)

在Linux中找出佔用大量CPU的Java程式碼(將Java執行緒與Linux PID進行關聯)

英文原文:http://blogs.manageengine.com/appmanager/2011/02/09/identify-java-code-consuming-high-cpu-in-linux-linking-jvm-thread-and-linux-pid

在Linux中,我們可以非常方便地找出佔用了大量CPU的有問題的Java程式碼。讓我通過下面的例子詳細解釋一下具體的操作步驟:

在上面的例子中,所有執行緒都在執行while迴圈。除了MyThread-1005 之外,其它執行緒都會不停地在迴圈中sleep 10秒鐘。MyThread-1005 執行緒不會進入sleep部分的程式碼,所以會不停地迴圈而不做sleep。因為有while迴圈,所以MyThread-1005 執行緒會導致很高的CPU利用率。

如何找到佔用了大量CPU的執行緒?

步驟1:

在命令列中執行'top'命令。你會看到一個PID為7074的'java'程序佔用了97%的CPU。

td

步驟2:

'top'命令顯示瞭如上圖所示的程序列表。按'shift + h',等幾秒鐘。你會看到上面游標的位置出現'Show threads on'的訊息字樣。現在,你可以看到執行緒級別的CPU/Memory利用率的詳細情況。你可以看到一個java執行緒,PID是7087使用了97%的CPU。

tdth

步驟3:

有問題的執行緒的PID(7087)是十進位制的。把它轉換成十六進位制 。7087相應的十六進位制的值是1BAF。然後轉換成小寫(1baf)。

步驟4:

做一個Thread Dump(kill -3 7074),然後在Thread Dump中查詢轉換出來的十六進位制的執行緒PID(1baf)。你可以找到一個'0x'開頭的'nid '值為1baf(20到22行)。你可以看到正是例子程式中有問題的執行緒MyThread-1005 。從這個執行緒的stack trace中,你可以找到有問題的程式碼然後修復它。

- Ramesh