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

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

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插件 打包jarapache

            <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>

2. java -jar test-0.0.1-SNAPSHOT-jar-with-dependencies.jar  運行程序maven

 

 一直在輸出工具

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

 

 

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

 

 由於咱們程序是起了50個線程 因此這裏就會展現這個進程中的全部線程呢線程

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

 

 

6.jstack 6167 >threadInfo.txt   信息輸出到文件 而後查看。也能夠直接在命令裏面查看blog

 

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

相關文章
相關標籤/搜索