定位java程序中占用cpu最高的線程堆棧信息

找出占用cpu最高的線程堆棧信息在java編碼中,有時會因為粗心導致cpu占用較高的情況,為了避免影響程序的正常運行 , 需要找到問題并解決 。這里模擬一個cpu占用較高的場景,并嘗試定位到代碼行 。示例代碼如下:
public class Math {public static final int initData = https://www.huyubaike.com/biancheng/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();}}}【定位java程序中占用cpu最高的線程堆棧信息】1,使用命令top -p,顯示你的java進程的內存情況,pid是你的java進程號,比如18963

定位java程序中占用cpu最高的線程堆棧信息

文章插圖
2,按H,獲取每個線程的內存情況
定位java程序中占用cpu最高的線程堆棧信息

文章插圖
3,找到內存和cpu占用最高的線程tid,比如18964
4 , 轉為十六進制得到 0x4a14,此為線程id的十六進制表示
5,執行 jstack 18963|grep -A 10 4a14,得到線程堆棧信息中 4cd0 這個線程所在行的后面10行,從堆棧中可以發現導致cpu飆高的調用方法
定位java程序中占用cpu最高的線程堆棧信息

文章插圖
6,查看對應的堆棧信息找出可能存在問題的代碼如上圖 , 定位到第15行代碼,是由于while循環導致的 。
定位java程序中占用cpu最高的線程堆棧信息

文章插圖

    推薦閱讀