定位java程式中佔用cpu最高的執行緒堆棧資訊

找出佔用cpu最高的執行緒堆棧資訊

在java編碼中,有時會因為粗心導致cpu佔用較高的情況,為了避免影響程式的正常運行,需要找到問題並解決。這裡模擬一個cpu佔用較高的場景,並嘗試定位到程式碼行。

示例程式碼如下:

public class Math {

    public static final int initData = 666;
    public static User user = new User();

    public int compute() {  //一個方法對應一塊棧幀記憶體區域
        int a = 1;
        int b = 2;
        int c = (a + b) * 10;
        return c;
    }

    public static void main(String[] args) {
        Math math = new Math();
        while (true){
            math.compute();
        }
    }
}

1,使用命令top -p ,顯示你的java進程的記憶體情況,pid是你的java進程號,比如18963

2,按H,獲取每個執行緒的記憶體情況

3,找到記憶體和cpu佔用最高的執行緒tid,比如18964

4,轉為十六進位得到 0x4a14,此為執行緒id的十六進位表示

5,執行 jstack 18963|grep -A 10 4a14,得到執行緒堆棧資訊中 4cd0 這個執行緒所在行的後面10行,從堆棧中可以發現導致cpu飆高的調用方法

6,查看對應的堆棧資訊找出可能存在問題的程式碼
如上圖,定位到第15行程式碼,是由於while循環導致的。