java jstack命令


 

jstack 應用

首先通過:ps -ef|grep java

得到java pid

查看哪個線程占用最多資源:

找出該進程內最耗費CPU的線程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid  命令查看這個進程下面的所有線程占用情況。

 

發現線程21742占用最多。

 

將剛剛發現占用cpu最多的線程id(21742)換算成16進制

命令:printf "%x\n" 21742 的到 線程值 :54ee

查看jstack 生成的文件:

jstack pid | grep tid

如:jstack 21711 | grep 54ee

下面可以看出是哪行代碼導致,查看那行代碼發現有死循環。跟蹤解決完畢。

 

 ---------------------------------------------------------------

 jps主要用來輸出JVM中運行的進程狀態信息。語法格式如下:

  jps [options] [hostid]
-q 不輸出類名、Jar名和傳入main方法的參數
-m 輸出傳入main方法的參數
-l 輸出main類或Jar的全限名
- v  輸出傳入JVM的參數
如:

[prdps@prdpsdev001iad bin]$ jps -m -l
48893 com.valueclickbrands.hybrid.HybridApiStart
57367 com.pricerunner.hybrid.HybridPageStart
57481 com.pricerunner.hybrid.HybridPageStart

 

 jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下:

jstack [option] pid
jstack [option] executable core
jstack [option] [server- id @]remote- hostname -or-ip
-l long listings,會打印出額外的鎖信息,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況
-m mixed mode,不僅會輸出Java堆棧信息,還會輸出C /C ++堆棧信息(比如Native方法)

 第一步先找出Java進程ID,我部署在服務器上的Java應用名稱為HybridApiStart:

[prdps@prdpsdev001iad bin]$ ps -ef|grep java|grep HybridApiStart|grep -v grep
prdps 48893 1 0 Jan27 ? 00:00:55 /ask/prun/dps/AllApp/Hybrid/jdk/bin/。。。。

 

第二步找出該進程內最耗費CPU的線程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我這里用第三個,輸出如下:

[prdps@prdpsdev001iad bin]$ top -Hp 48893

top - 04:29:29 up 407 days, 2:00, 5 users, load average: 0.00, 0.04, 0.09
Tasks: 102 total, 0 running, 102 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 65957312k total, 24918236k used, 41039076k free, 2608264k buffers
Swap: 1048568k total, 8060k used, 1040508k free, 14009316k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21742 prdps 20 0 36.5g 1.7g 144m S 0.0 2.8 0:00.02 java
48896 prdps 20 0 36.5g 1.7g 144m S 0.0 2.8 0:05.14 java

 

    TIME列就是各個Java線程耗費的CPU時間,選一個線程ID為21742的線程,用

  printf "%x\n" 21742

    得到21742的十六進制值為54ee,下面會用到。    

    OK,下一步終於輪到jstack上場了,它用來輸出進程21711的堆棧信息,然后根據線程ID的十六進制值grep,如下:

  jstack 21711 | grep 54ee

  就能看到結果了;

 

C、 jmap(Memory Map)和jhat(Java Heap Analysis Tool)

    jmap用來查看堆內存使用狀況,一般結合jhat使用。

    jmap語法格式如下:

jmap [option] pid
jmap [option] executable core
jmap [option] [server- id @]remote- hostname -or-ip
 
jmap -permstat pid
打印進程的類加載器和類加載器加載的持久代對象信息,輸出:類加載器名稱、對象是否存活(不可靠)、對象地址、父類加載器、已加載的類大小等信息。
 
使用jmap -heap pid查看進程堆內存使用情況,包括使用的GC算法、堆配置參數和各代中堆內存使用情況。
 
使用jmap -histo[:live] pid查看堆內存中的對象數目、大小統計直方圖,如果帶上live則只統計活對象
 

D、jstat(JVM統計監測工具)

    語法格式如下:

  jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

    vmid是Java虛擬機ID,在Linux/Unix系統上一般就是進程ID。interval是采樣時間間隔。count是采樣數目。比如下面輸出的是GC信息,采樣時間間隔為250ms,采樣數為4:

  jstat -gc 21711 250 4

 

參見:http://my.oschina.net/feichexia/blog/196575


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM