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