java開發必須掌握的線上問題排查命令

  • 2019 年 10 月 3 日
  • 筆記

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

給一個系統定位問題的時候,知識、經驗是關鍵,數據是依據,工具是運用知識處理數據的手段。為了便於我們排查和解決問題,Sun公司為我們提供了一些常用命令。這些命令一般都是jdk/lib/tools.jar中類庫的一層薄包裝。隨着JVM的安裝一起被安裝到機器中,在bin目錄中。下面就來認識一下這些命令以及具體使用方式。

jps

功能

jps位於jdk的bin目錄下,其作用是顯示當前系統的java進程情況,及其pid號。 jps相當於Solaris進程工具ps。不象"pgrep java"或"ps -ef grep java",jps並不使用應用程序名來查找JVM實例。因此,它查找所有的Java應用程序,包括即使沒有使用java執行體的那種(例如,定製的啟動 器)。另外,jps僅查找當前用戶的Java進程,而不是當前系統中的所有進程。

常用指令

jps:顯示當前用戶的所有java進程的PID

jps -v 3331:顯示虛擬機參數

jps -m 3331:顯示傳遞給main()函數的參數

jps -l 3331:顯示主類的全路徑

jinfo

功能

jinfo可以輸出java進程、core文件或遠程debug服務器的配置信息。這些配置信息包括JAVA系統參數及命令行參數,如果進程運行在64位虛擬機上,需要指明-J-d64參數,如:jinfo -J-d64 -sysprops pid

jdk8中已經不支持該命令。

常用指令

jinfo -flag CMSIniniatingOccupancyFration 3331:查詢CMSIniniatingOccupancyFration參數值

jstat

功能

jstat(JVM Statistics Monitoring Tool)是用於監控虛擬機各種運行狀態信息的命令行工具。他可以顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形的服務器上,它是運行期定位虛擬機性能問題的首選工具。

常用指令

jstat -gc 3331 250 20 :查詢進程2764的垃圾收集情況,每250毫秒查詢一次,一共查詢20次。

jstat -gccause:額外輸出上次GC原因

jstat -calss:查詢類裝載、類卸載、總空間以及所消耗的時間

jmap

功能

jmap是JDK自帶的工具軟件,主要用於打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。可以使用jmap生成堆轉儲快照(Heap Dump)。

常用指令

jmap -heap 3331:查看java 堆(heap)使用情況

jmap -histo 3331:查看堆內存(histogram)中的對象數量及大小

jmap -histo:live 3331:JVM會先觸發gc,然後再統計信息

jmap -dump:format=b,file=heapDump 3331:將內存使用的詳細情況輸出到文件,之後一般使用其他工具進行分析。

jhat

功能

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

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

常用指令

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

jhat heapDump:解析Java堆轉儲文件,並啟動一個 web server

jstack

功能

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。 線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後台做什麼事情,或者等待什麼資源。 如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。

jstack命令主要用來查看Java線程調用堆棧的,可以用來分析線程問題(如死鎖)。

常用指令

jstack 3331:查看線程情況

jstack -F 3331:正常輸出不被響應時,使用該指令

jstack -l 3331:除堆棧外,顯示關於鎖的附件信息

常見問題定位過程

頻繁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 查看線程情況

結語

經常使用適當的虛擬機監控和分析工具可以加快我們分析數據、定位解決問題的速度,但也要知道,工具永遠都是知識技能的一層包裝,沒有什麼工具是包治百病的。