環(huán)境:JDK1.8.0_92
JDK(JAVA Development Kit)提供了一系列的命令行工具,用于幫助開發(fā)人員進行問題排查。以下是關于JDK命令行工具問題排查的一些常見操作:
- 使用jps查看虛擬機進程:jps是一個用于顯示Java虛擬機(JVM)進程信息的工具。通過jps指令可以獲取到正在運行的JVM進程的ID(PID),這對于后續(xù)的問題排查非常有用。
- 使用jstat監(jiān)視虛擬機運行時信息:jstat是一個用于監(jiān)視虛擬機運行時各種信息的工具。它可以監(jiān)控類加載數(shù)量、內存使用情況、垃圾回收情況等信息,對于排查內存泄漏、GC問題等非常有用。
- 使用jstack獲取線程堆棧信息:jstack是一個用于獲取Java線程堆棧信息的工具。當JVM進程出現(xiàn)異常或卡頓時,可以使用jstack指令獲取線程堆棧信息,以幫助開發(fā)人員找到問題所在。
- 使用jmap生成堆轉儲文件:jmap是一個用于生成Java堆轉儲文件的工具。當JVM內存溢出或需要排查內存問題時,可以使用jmap指令生成堆轉儲文件,以幫助開發(fā)人員找到內存泄漏或垃圾回收等問題。
以上是JDK命令行工具問題排查中常用的幾個操作,它們可以幫助開發(fā)人員快速定位和解決問題。當然,還有其他JDK提供的工具也可以用于問題排查,例如jconsole、jvisualvm等。
JDK命令行工具所在目錄%JAVA_HOME%bin 目錄下:
圖片
這里你會發(fā)現(xiàn)這些工具的大小基本上都是17kb左右。為何?因為這些工具大部分都是
%JAVA_HOME%bintools.jar這個jar中的類實現(xiàn)的,而這里的可執(zhí)行exe文件只是對這寫功能做了簡單的一個封裝而已。
對應到tools.jar中
圖片
接下來對常用的工具做介紹:
1.jps
顯示所有當前正在運行的HosSpot虛擬機進程。
圖片
參數(shù):
-l :輸出完整的包名+類名,如果執(zhí)行的是jar包,輸出jar包的路徑。
圖片
-m:輸出啟動程序時,傳的參數(shù)信息。
測試程序:
public class JpsMAIn {
public static void main(String[] args) throws Exception {
System.out.println(Arrays.toString(args)) ;
System.in.read() ;
}
}
啟動參數(shù)設置:
圖片
啟動時設置了3個參數(shù)分別是:a , b , c
查看:
圖片
-v:輸出進程啟動時的jvm參數(shù)。
還是以上面的測試程序為例:
啟動jvm參數(shù)設置:
圖片
查看:
圖片
-q:只輸出進程號。
圖片
到此jps工具介紹完畢。
2.jstat
用于監(jiān)視虛擬機運行時的各種信息。如:類加載,內存,垃圾回收等信息。
使用格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
vmid:表示jvm進程號。
interval:表示查詢間隔(單位秒 s,毫秒 ms)。
count:表示查詢次數(shù)
查看option有哪些選項信息(也就是可以監(jiān)控哪些信息)
命令:
jstat -options
圖片
-class: 顯示類加載,卸載的數(shù)量,總空間及加載所耗時。
圖片
-compiler:顯示JIT編譯器編譯過的方法,耗時等信息。
圖片
-gc:監(jiān)視Java堆的使用情況,GC時間等信息。
圖片
S0C:第一個幸存區(qū)的大小
S1C:第二個幸存區(qū)的大小
S0U:第一個幸存區(qū)的使用大小
S1U:第二個幸存區(qū)的使用大小
EC:伊甸園區(qū)的大小
EU:伊甸園區(qū)的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法區(qū)大小
MU:方法區(qū)使用大小
CCSC:壓縮類空間大小
CCSU:壓縮類空間使用大小
YGC:年輕代垃圾回收次數(shù)
YGCT:年輕代垃圾回收消耗時間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間
-gcutil:該選項與-gc基本相同,但他主要關注的是已使用空間占總空間的百分比。
S0:幸存1區(qū)當前使用比例
S1:幸存2區(qū)當前使用比例
E:伊甸園區(qū)使用比例
O:老年代使用比例
M:元數(shù)據(jù)區(qū)使用比例
CCS:壓縮使用比例
YGC:年輕代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間
-gcnew:監(jiān)視年輕代GC情況。
圖片
圖片
-gcold:監(jiān)視老輕代GC情況。
圖片
示例:
jstat -gc 16480 3s
每3秒統(tǒng)計一次gc信息。
圖片
3. jinfo
實時查看和調整虛擬機各項參數(shù)。
使用:
jinfo option pid
示例:
輸出當前jvm進程的完整信息
圖片
查詢具體jvm參數(shù)值信息:
jinfo -flag CICompilerCount 16480
4. jmap
用于生成堆轉儲快照信息。
使用格式:
jmap [option] pid
option參數(shù)說明:
-dump:生成Java堆轉儲快照
jmap -dump:live,format=b,file=heap.bin <pid>
示例:
圖片
圖片
-heap:顯示Java堆詳細信息。如:使用的垃圾回收期,參數(shù)配置,分代信息等。
jmap -heap <pid>
示例:
圖片
-histo:顯示堆中對象的統(tǒng)計信息,包括類,實例數(shù),合計容量等。
jmap -histo <pid>
示例:
圖片
5. jhat
堆轉儲文件分析工具。
使用格式:
jhat <file>
分析上面生成的文件
示例:
圖片
這里生成了一個端口為7000的服務,直接訪問
圖片
6. jstack
用于生成當前進程中當前時刻線程的快照。
使用格式:
jstack [option] <pid>
參數(shù):
-F:當正常輸出的請求不被響應時,強制輸出線程堆棧。
-l:除了顯示堆棧信息,還顯示關于鎖的相關信息。
-m:如果調用的是本地方法,可以顯示C/C++的堆棧。
示例:
圖片
圖片
完畢!!!