做爲一個合格的開發人員,不只要能寫得一手還代碼,還有一項很重要的技能就是排查問題。這裏提到的排查問題不單單是在coding的過程當中debug等,還包括的就是線上問題的排查。因爲在生產環境中,通常沒辦法debug(其實有些問題,debug也白扯。。。),因此咱們須要藉助一些經常使用命令來查看運行時的具體狀況,這些運行時信息包括但不限於運行日誌、異常堆棧、堆使用狀況、GC狀況、JVM參數狀況、線程狀況等。java
給一個系統定位問題的時候,知識、經驗是關鍵,數據是依據,工具是運用知識處理數據的手段。爲了便於咱們排查和解決問題,Sun公司爲咱們提供了一些經常使用命令。這些命令通常都是jdk/lib/tools.jar中類庫的一層薄包裝。隨着JVM的安裝一塊兒被安裝到機器中,在bin目錄中。下面就來認識一下這些命令以及具體使用方式。文中涉及到的全部命令的詳細信息能夠參考 Java命令學習系列文章web
顯示當前全部java進程pid的命令。函數
jps
:顯示當前用戶的全部java進程的PID工具
jps -v 3331
:顯示虛擬機參數學習
jps -m 3331
:顯示傳遞給main()函數的參數線程
jps -l 3331
:顯示主類的全路徑debug
實時查看和調整虛擬機參數,能夠顯示未被顯示指定的參數的默認值(jps -v 則不能
)。日誌
jdk8中已經不支持該命令。code
jinfo -flag CMSIniniatingOccupancyFration 1444
:查詢CMSIniniatingOccupancyFration參數值orm
顯示進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。
jstat -gc 3331 250 20
:查詢進程2764的垃圾收集狀況,每250毫秒查詢一次,一共查詢20次。
jstat -gccause
:額外輸出上次GC緣由
jstat -calss
:件事類裝載、類卸載、總空間以及所消耗的時間
生成堆轉儲快照(heapdump)
jmap -heap 3331
:查看java 堆(heap)使用狀況
jmap -histo 3331
:查看堆內存(histogram)中的對象數量及大小
jmap -histo:live 3331
:JVM會先觸發gc,而後再統計信息
jmap -dump:format=b,file=heapDump 3331
:將內存使用的詳細狀況輸出到文件,以後通常使用其餘工具進行分析。
通常與jmap搭配使用,用來分析jmap生成的堆轉儲文件。
因爲有不少可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)能夠替代,因此不多用。不過在沒有可視化工具的機器上也是可用的。
jmap -dump:format=b,file=heapDump 3331
+ jhat heapDump
:解析Java堆轉儲文件,並啓動一個 web server
生成當前時刻的線程快照。
jstack 3331
:查看線程狀況
jstack -F 3331
:正常輸出不被響應時,使用該指令
jstack -l 3331
:除堆棧外,顯示關於鎖的附件信息
1、使用jps
查看線程ID
2、使用jstat -gc 3331 250 20
查看gc狀況,通常比較關注PERM區的狀況,查看GC的增加狀況。
3、使用jstat -gccause
:額外輸出上次GC緣由
4、使用jmap -dump:format=b,file=heapDump 3331
生成堆轉儲文件
5、使用jhat或者可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆狀況。
6、結合代碼解決內存溢出或泄露問題。
1、使用jps
查看線程ID
2、使用jstack 3331
:查看線程狀況
常常使用適當的虛擬機監控和分析工具能夠加快咱們分析數據、定位解決問題的速度,但也要知道,工具永遠都是知識技能的一層包裝,沒有什麼工具是包治百病的。