面試問題---JAVA程序CPU佔用過高怎麼定位

面試問題---JAVA程序CPU佔用過高怎麼定位

今天一個電話面試問了這個問題。回來查了下答案,自己也順帶操作一遍,做個記錄。之前只知道jstack工具可以查看線程狀態這些。比如死鎖這些,主要是之前不知道top -H -p pid這個命令的使用,這命令可以看到進程下面線程信息,拿到線程ID,然後再結合jstack命令使用就可以解決這個問題了。下面記錄一下具體的操作步驟:

1.打個jar包丟到機器上運行

package com.nijunyang.test;

public class TestApplication {

public static void main(String[] args) {
    for (int i = 0; i < 50; i++) {
        new Thread(()->test()).start();
    }

}

public static void test() {
    while (true) {
        int a = 1  + 6;
        System.out.println(a);
    }
}

}

使用這個maven插件 打包jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.nijunyang.test.TestApplication</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
  1. java -jar test-0.0.1-SNAPSHOT-jar-with-dependencies.jar  運行程序

一直在輸出

3.top |grep java  或者 jps指令找到java進程的pid(6167)

4. top -H -p pid   以線程的形式查看該進程 top -H -p 6167

因爲我們程序是起了50個線程 所以這裏就會展示這個進程中的所有線程呢

5.前面的線程ID是10進制的,,需要轉換成16進制,,因爲等下在jstack命令取出來的線程ID是16進制的:這裏就隨便選一個線程ID 去轉換了,真實環境肯定是選擇CPU佔用率最高的那個線程,echo "obase=16;6219" | bc

6.jstack 6167 >threadInfo.txt   信息輸出到文件 然後查看。也可以直接在命令裏面查看

7.文件中查找184b的線程ID信息,就可以找到是哪個線程導致的內存佔用過高,同時也能看到具體的代碼位置

原文地址https://www.cnblogs.com/nijunyang/p/13040511.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章