天天看點

[Java基礎]--Java開發必須掌握的線上問題排查指令

作為一個合格的開發人員,不僅要能寫得一手還代碼,還有一項很重要的技能就是排查問題。這裡提到的排查問題不僅僅是在coding的過程中debug等,還包括的就是線上問題的排查。由于在生産環境中,一般沒辦法debug(其實有些問題,debug也白扯。。。),是以我們需要借助一些常用指令來檢視運作時的具體情況,這些運作時資訊包括但不限于運作日志、異常堆棧、堆使用情況、GC情況、JVM參數情況、線程情況等。

給一個系統定位問題的時候,知識、經驗是關鍵,資料是依據,工具是運用知識處理資料的手段。為了便于我們排查和解決問題,Sun公司為我們提供了一些常用指令。這些指令一般都是jdk/lib/tools.jar中類庫的一層薄包裝。随着JVM的安裝一起被安裝到機器中,在bin目錄中。下面就來認識一下這些指令以及具體使用方式。文中涉及到的所有指令的詳細資訊可以參考 ​​Java指令學習系列文章​​

jps

功能

顯示目前所有java程序pid的指令。

常用指令

​jps​

​​:顯示目前使用者的所有java程序的PID​

​jps -v 3331​

​​:顯示虛拟機參數​

​jps -m 3331​

​​:顯示傳遞給main()函數的參數​

​jps -l 3331​

​:顯示主類的全路徑

​​詳細介紹​​

jinfo

功能

實時檢視和調整虛拟機參數,可以顯示未被顯示指定的參數的預設值(​

​jps -v 則不能​

​)。

jdk8中已經不支援該指令。

常用指令

​jinfo -flag CMSIniniatingOccupancyFration 1444​

​:查詢CMSIniniatingOccupancyFration參數值

​​詳細介紹​​

jstat

功能

顯示程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料。

常用指令

​jstat -gc 3331 250 20​

​​

​jstat -gccause​

​​:額外輸出上次GC原因​

​jstat -calss​

​:件事類裝載、類解除安裝、總空間以及所消耗的時間

​​詳細介紹​​

jmap

功能

生成堆轉儲快照(heapdump)

常用指令

​jmap -heap 3331​

​​:檢視java 堆(heap)使用情況​

​jmap -histo 3331​

​​:檢視堆記憶體(histogram)中的對象數量及大小​

​jmap -histo:live 3331​

​​:JVM會先觸發gc,然後再統計資訊​

​jmap -dump:format=b,file=heapDump 3331​

​:将記憶體使用的詳細情況輸出到檔案,之後一般使用其他工具進行分析。

​​詳細介紹​​

jhat

功能

一般與jmap搭配使用,用來分析jmap生成的堆轉儲檔案。

由于有很多可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)可以替代,是以很少用。不過在沒有可視化工具的機器上也是可用的。

常用指令

​jmap -dump:format=b,file=heapDump 3331​

​​ + ​

​jhat heapDump​

​:解析Java堆轉儲檔案,并啟動一個 web server

​​詳細介紹​​

jstack

功能

生成目前時刻的線程快照。

常用指令

​jstack 3331​

​​:檢視線程情況​

​jstack -F 3331​

​​:正常輸出不被響應時,使用該指令​

​jstack -l 3331​

​:除堆棧外,顯示關于鎖的附件資訊

​​詳細介紹​​

常見問題定位過程

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

一、使用​

​jps​

​​檢視線程ID二、使用​

​jstat -gc 3331 250 20​

​​三、使用​

​jstat -gccause​

​​:額外輸出上次GC原因四、使用​

​jmap -dump:format=b,file=heapDump 3331​

​生成堆轉儲檔案

五、使用jhat或者可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情況。

六、結合代碼解決記憶體溢出或洩露問題。

死鎖問題

結語