JVM監控及診斷工具-指令行篇
一、概述
簡單指令行工具:
以上
.jar
的程式源碼在
tools.jar
中
二、jps:檢視正在運作的Java程序
ps -ef|grep java
1、基本情況
2、測試
根據基本文法進行測試即可
3、基本文法
可以通過
jps -help
來檢視對應的參數資訊
①options參數
綜合使用:
jps -l -m等價于jps -lm
如何将資訊輸出到同級檔案中:
文法:指令 > 檔案名稱
例如:jps -l > a.txt
②hostid參數
三、jstat:檢視JVM統計資訊
1、基本情況
通過指令行的方式,純文字的方式去監視
整個記憶體JVM的占用
2、基本文法
其中vmid是程序id号,也就是jps之後看到的前面的号碼,如下:
①option參數
- 列印編譯所花費的時間次數等資訊:↓
- 列印被jit編譯器編譯過的方法:↓
1、-class舉例:
簡單使用:↓
h3 中的3代表每隔3個分隔一次,
13344 代表類的程序id,
1000 代表每隔1000毫秒列印一次,
10 代表一共列印10次,
如下所示:
Timestamp代表:程式至今的運作時間,機關為秒;
Loaded代表:加載的類的數目;
Bytes代表:加載的類的總位元組數;
Unloaded代表:解除安裝的類的數目;
Bytes代表:解除安裝的類的總位元組數;
Time代表:類裝載所消耗的時間;
2、-gc舉例:
13344代表類的程序id,執行結果如下所示:
S0C:代表幸存者0區的總容量,
S1C:代表幸存者1區的總容量,
S0U:代表幸存者0區使用的容量,
S1U:代表幸存者1區使用的容量,
EC:代表伊甸園區的總容量,
EU:代表伊甸園區使用的總容量,
OC:代表老年代的總容量,
OU:代表老年代已經使用的容量,
MC:代表方法區的總容量,
MU:代表方法區的總容量,
CCSC:代表壓縮類的總容量,
CCSU:代表壓縮類使用的容量,
YGC:代表年輕代垃圾回收的次數,
YGCT:年輕代進行垃圾回收需要的時間,
FGC:代表代表Full GC的次數,
FGCT:代表Full GC的時間,
GCT:代表垃圾回收的總時間
3、-gccapacity舉例:
13344代表類的程序id,執行結果如下:
其中S0C代表幸存者0區的容量,S1C代表幸存者1區的容量,EC代表伊甸園區的容量,CCSC代表壓縮類的容量,YGC代表年輕代垃圾回收的時間,FGC代表Full GC垃圾回收的時間
4、-gcutil舉例:
檢視堆記憶體空間占比情況
13152代表類的程序id,執行結果如下所示:
以上是
各區域占比以及垃圾回收的情況
,S0代表幸存者0區,S1代表幸存者1區,E代表伊甸園區,O代表老年代,M代表方法區,CCS代表壓縮類,以上這些值都是占比情況,YGC代表年輕代垃圾回收的次數,YGCT年輕代進行垃圾回收需要的時間,FGC代表代表Full GC的次數,FGCT代表Full GC的時間,GCT代表垃圾回收的總時間
5、-gccause舉例:
發生GC的原因
13344代表類的程序id,執行結果如下:
以上是
各區域占比以及垃圾回收的情況,還有觸發垃圾回收的原因解釋
,S0代表幸存者0區,S1代表幸存者1區,E代表伊甸園區,O代表老年代,M代表方法區,CCS代表壓縮類,以上這些值都是占比情況,YGC代表年輕代垃圾回收的次數,YGCT年輕代進行垃圾回收需要的時間,FGC代表代表Full GC的次數,FGCT代表Full GC的時間,GCT代表垃圾回收的總時間,LGCC和GCC代表垃圾回收的原因
②interval參數
用于指定輸出統計資料的周期,機關為毫秒。即:
查詢間隔
,每個多少時間查詢一次
③count參數
用于
指定查詢的總次數
④-t參數
可以在輸出資訊前加上一個Timestamp列,顯示程式的運作時間。機關:秒
經驗:↓
執行jstat -gc -t 13152 1000 10,這代表1秒列印出1行,一共10行,-t代表列印出Timestamp總運作時間,結果如下所示:
上方紅色框框中代表Timestamp,而藍色框框中代表垃圾回收時間,機關都是秒,如果讓紅色框框中的某兩個值相減,假設這個值是num1,然後讓對應行的藍色框框中的另外兩個值相減,假設這個值是num2,之後讓num2/num1,得出的內插補點就是上述所說的GC時間占運作時間的比例
雖然這種方式比較繁瑣,但是在項目部署之後就需要使用指令行去看了,就沒有可視化界面了,是以這種方式也要會
左側的是通過
-t
,知道程式執行的時間,兩段可以相減算出這段時間内右側GC時間相減獲得這段時間的GC時間,右側除以左側,就可以算出垃圾回收時間占這段程式執行時間的比例,如果
比例超過20%
,就表明堆的壓力比較大了
⑤-h參數
可以在周期性資料輸出時,輸出多少行資料後輸出一個表頭資訊
3、補充
第1步可以執行指令:
jstat -gc -t 14024 1000 10
一段時間内抽取OU中的最小值,進行比較,如果發現不斷上漲,就出現記憶體洩露
四、jinfo:實時檢視和修改JVM配置參數
主要用來擷取某一個參數的值,修改比較少
1、基本情況
Bean對象get/set()
2、基本文法
①檢視
- jinfo -sysprops 程序id
可以檢視由System.getProperties()取得的參數
程序id可以通過jps指令檢視,操作結果如下:
- jinfo -flags 程序id
檢視目前程序曾經賦過值的一些參數情況
程序id可以通過jps指令檢視,參數指派的一部分是我們自己設定的,另外一部分是系統自動優化設定的參數資訊,具體操作如下:
- jinfo -flag 參數名稱 程序id
檢視某個java程序的具體參數的資訊
程序id可以通過jps指令檢視
②修改
- 針對boolean類型
jinfo -flag [+|-]參數名稱 程序id
PID可以通過jps指令檢視,如果使用+号,那就可以讓該參數起作用,否則使用-号就讓該參數不起作用
- 針對非boolean類型
jinfo -flag 參數名稱=參數值 程序id
PID可以通過jps指令檢視,如果使用+号,那就可以讓該參數起作用,否則使用-号就讓該參數不起作用
3、拓展
①java -XX:+PrintFlagsInitial
檢視所有JVM參數啟動的
初始值
②java -XX:+PrintFlagsFinal
檢視所有JVM參數的
最終值
③java -參數名稱:+PrintCommandLineFlags
檢視那些已經被使用者或者JVM設定過的詳細的XX參數的名稱和值
五、jmap:導出記憶體映像檔案&記憶體使用情況
關注更多
堆空間
的情況
1、基本情況
jvm
堆
記憶體映射
将某個階段的記憶體情況映射成一個快照檔案
生成的dump檔案是不能通過記事本直接打開的,因為他是二進制檔案
2、基本文法
1、使用文法可以通過在DOS視窗中使用jmap/jmap -h/jmap -help檢視
2、代表可執行的代碼,比如使用> 檔案名稱來指定生成的dump檔案的生成位置
3、[server_id@]是為遠端連接配接準備的
3、使用1:導出記憶體映像檔案
注意:
- 對于以上說明中的第1點是自動方式才會這樣做,而手動不會在Full GC之後生成Dump
- 使用手動方式生成dump檔案,一般指令執行之後就會生成,不用等到快出現OOM的時候
- 使用自動方式生成dump檔案,當出現OOM之前先生成dump檔案
- 如果使用手動方式,一般使用第2種,畢竟生成堆中存活對象的dump檔案是比較小的,便于傳輸和分析
①手動的方式
說明:
- 中的
,而filename是檔案名稱
,代表該值可以省略,當然後面的是程序id,需要通過jps查詢出來.hprof是字尾名
-
,用來進行格式限定format=b表示生成的是标準的dump檔案
生成堆中所有對象的快照:
生成堆中存活對象的快照:
其中
file
=後面的是生成的dump檔案位址,最後的11696是程序id,可以通過jps檢視
一般使用的是第二種方式,也就是生成堆中存活對象的快照
,畢竟這種方式生成的dump檔案更小,我們傳輸處理都更友善
jmap -dump:format=b,file=<filename.hprof> < pid > #生成堆中所有對象的快照
jmap -dump:live,format=b,file=<filename.hprof> < pid > #生成堆中存活對象的快照
②自動的方式
在快要發生OOM之前,自動生成dump檔案
具體使用如下:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>
#比如
-Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:heapDumpPath=D:\m.hprof
4、使用2:顯示堆記憶體相關資訊
擷取展示運作指令的
這一刻
的堆記憶體情況,且傳回的資料必然是在
安全點上
①jmap -heap 程序id
jmap -heap 程序id隻是時間點上的堆資訊,而jstat後面可以添加參數,可以指定時間動态觀察資料改變情況,而圖形化界面工具,例如jvisualvm等,它們可以用圖表的方式動态展示出相關資訊,更加直覺明了
②jmap -histo 程序id
輸出堆中對象的同級資訊,包括類、執行個體數量和合計容量,也是這一時刻的記憶體中的對象資訊
5、使用3:其他作用
這兩個指令僅linux/solaris平台有效,是以無法在windows操作平台上示範,并且使用比較小衆,不在多說
- jmap -permstat 程序id
檢視系統的ClassLoader資訊
- jmap -finalizerinfo
檢視堆積在finalizer隊列中的對象
6、小結
因為他jmap所擷取到的資料是借助安全點的,是以會出現資料結果的偏差情況
六、jhat:JDK自帶堆分析工具
去分析用jmap導出的dump檔案
jhat指令在jdk9及其之後就
被移除
了,官方建議使用jvisualvm代替jhat,是以該指令隻需簡單了解一下即可
1、基本情況
2、基本文法
其中dumpfile代表dump檔案的位址以及名稱,例如:
- options參數
舉例如下:
提供了端口為7000的一個界面:↓
七、jstack:列印JVM中線程快照
列印單獨jvm程序中的所有
線程
的狀态快照
1、基本情況
2、基本文法
總結:
如果程式出現等待問題,可以使用該指令去檢視問題所在,結果中也會提示你問題所在
八、jcmd:多功能指令行
一個頂多個,真的很強,終極縫合怪
1、基本情況
2、基本文法
- jcmd 程序号 具體指令
首先通過jcmd 程序号 help得出以下指令清單:
根據以上指令來替換之前的那些操作:
- Thread.print 可以替換 jstack指令
- GC.class_histogram 可以替換 jmap中的-histo操作
- GC.heap_dump 可以替換 jmap中的-dump操作
- GC.run 可以檢視GC的執行情況
- VM.uptime 可以檢視程式的總執行時間,可以替換jstat指令中的-t操作
- VM.system_properties 可以替換 jinfo -sysprops 程序id
- VM.flags 可以擷取JVM的配置參數資訊
- 等…