※推薦評價好的iphone維修中心
擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢
今天一個電話面試問了這個問題。回來查了下答案,自己也順帶操作一遍,做個記錄。之前只知道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>
2. 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信息,就可以找到是哪個線程導致的內存佔用過高,同時也能看到具體的代碼位置
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
※台北網頁設計公司這麼多該如何選擇?
網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品