定位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循環導致的。


