Java——命令jps、jstat、jmap、jstack、jhat、jinfo

gary-liu發表於2017-04-30

JAVA_HOME/bin/ 目錄下jdk提供了很多自帶工具,下面以tomcat下的web專案為例。如果感覺輸出內容太多可以使用 xxx | head -n 20 顯示輸出內容的頭20行。

jps

jps:顯示當前使用者的所有java程式的PID
jps -help

usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]

-m 輸出傳遞給main 方法的引數,在嵌入式jvm上可能是null,tomcat下的web專案為例

14002 Jps -m
21206 Bootstrap start

-l 輸出應用程式main class的完整package名 或者 應用程式的jar檔案完整路徑名

21206 org.apache.catalina.startup.Bootstrap
14062 sun.tools.jps.Jps

-v 輸出傳遞給JVM的引數,要顯示其他使用者的還是隻能用unix/linux的 ps 命令。

jps 僅查詢當前使用者的Java程式,而不是當前系統中的所有程式。

jstat

jstat(JVM Statistics Monitoring Tool)是用於監控虛擬機器各種執行狀態資訊的命令列工具。他可以顯示本地或遠端虛擬機器程式中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料。包括了對Heap size和使用請看,垃圾回收狀況的監控。

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

jstat -gc 21206 250 20  //查詢程式pid 21206的垃圾收集情況,每250毫秒查詢一次,一共查詢20次。
jstat -gccause pid //額外輸出上次GC原因
jstat -calss pid  //類裝載、類解除安裝、總空間以及所消耗的時間
jstat –gcnew pid  //監視新生代GC的狀況
jstat –gcold pid  //監視老年代GC的狀況

-gc 中的引數

S0C 年輕代中第一個survivor(倖存區)的容量 (位元組) S1C 年輕代中第二個survivor(倖存區)的容量 (位元組) S0U 年輕代中第一個survivor(倖存區)目前已使用空間 (位元組) S1U 年輕代中第二個survivor(倖存區)目前已使用空間 (位元組) EC 年輕代中Eden(伊甸園)的容量 (位元組) EU 年輕代中Eden(伊甸園)目前已使用空間 (位元組) OC Old代的容量 (位元組) OU Old代目前已使用空間 (位元組) PC Perm(持久代)的容量 (位元組) PU Perm(持久代)目前已使用空間 (位元組) YGC 從應用程式啟動到取樣時年輕代中gc次數 YGCT 從應用程式啟動到取樣時年輕代中gc所用時間(s) FGC 從應用程式啟動到取樣時old代(全gc)gc次數 FGCT 從應用程式啟動到取樣時old代(全gc)gc所用時間(s) GCT 從應用程式啟動到取樣時gc用的總時間(s)

jmap

生成堆轉儲快照(heap dump)
列印指定Java程式(或核心檔案、遠端除錯伺服器)的共享物件記憶體對映或堆記憶體細節。

堆Dump是反應Java堆使用情況的記憶體映象,其中主要包括系統資訊、虛擬機器屬性、完整的執行緒Dump、所有類和物件的狀態等。 一般,在記憶體不足(OOM)、GC異常等情況下,我們就會懷疑有記憶體洩露。這個時候我們就可以製作堆Dump來檢視具體情況,分析原因。

常用指令

jmap -heap pid //檢視java 堆(heap)使用情況和堆記憶體的初始化值(易讀,清晰)
jmap -histo pid //檢視堆記憶體(histogram)中的物件數量及大小 (實用)
jmap -histo:live pid //JVM會先觸發gc,然後再統計資訊 (gc後物件一下少了一半)
jmap -dump:format=b,file=heapDump pid //將記憶體使用的詳細情況輸出到檔案,之後一般使用其他工具進行分析。

jstack

生成當前時刻的執行緒快照。
生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等。
jstack命令主要用來檢視Java執行緒的呼叫堆疊的,可以用來分析執行緒問題(如死鎖)。

常用指令

jstack pid  //檢視執行緒情況
jstack -F pid  //正常輸出不被響應時,使用該指令
jstack -l pid  //除堆疊外,顯示關於鎖的附件資訊

wait on monitor entry: 被阻塞的,肯定有問題
runnable : 注意IO執行緒
in Object.wait(): 注意非執行緒池等待

jhat

jhat:(Java Heap Analysis Tool)是一個用來分析java的堆情況的命令。使用jmap可以生成Java堆的Dump檔案。生成dump檔案之後就可以用jhat命令,將dump檔案轉成html的形式,然後通過http訪問可以檢視堆情況。

jinfo

jinfo可以輸出java程式、core檔案或遠端debug伺服器的配置資訊。

常見問題

頻繁GC問題或記憶體溢位問題

一、使用jps檢視執行緒ID
二、使用jstat -gc 3331 250 20 檢視gc情況,一般比較關注PERM區的情況,檢視GC的增長情況。
三、使用jstat -gccause額外輸出上次GC原因
四、使用jmap -dump:format=b,file=heapDump 3331生成堆轉儲檔案
五、使用jhat或者視覺化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情況。
六、結合程式碼解決記憶體溢位或洩露問題。

死鎖問題

一、使用jps檢視執行緒ID
二、使用jstack pid檢視執行緒情況

摘自:http://www.hollischuang.com/archives/1561

OutOfMemery如何處理

首先線上應用的jvm配置要養成良好的習慣,增加一下配置則可以在jvm發生 oom的時候自動dump日誌了 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/log/dump/jvm-oom.log

總結

1.如果程式記憶體不足或者頻繁GC,很有可能存在記憶體洩露情況,這時候就要藉助Java堆Dump檢視物件的情況。
2.要製作堆Dump可以直接使用jvm自帶的jmap命令
3.可以先使用jmap -heap命令檢視堆的使用情況,看一下各個堆空間的佔用情況。

參考資料

Java命令學習系列(四)——jstat (系列文章很好,很全)

相關文章