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

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 (系列文章很好,很全)

發佈了218 篇原創文章 · 獲贊 267 · 訪問量 67萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章