天天看點

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

JVM監控及診斷工具-指令行篇

一、概述

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

簡單指令行工具:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

以上

.jar

的程式源碼在

tools.jar

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

二、jps:檢視正在運作的Java程序

ps -ef|grep java
           

1、基本情況

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

2、測試

根據基本文法進行測試即可

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

3、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

可以通過

jps -help

來檢視對應的參數資訊

①options參數

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

綜合使用:

jps -l -m等價于jps -lm
           

如何将資訊輸出到同級檔案中:

文法:指令 > 檔案名稱
例如:jps -l > a.txt
           

②hostid參數

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

三、jstat:檢視JVM統計資訊

1、基本情況

通過指令行的方式,純文字的方式去監視

整個記憶體JVM的占用

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

2、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

其中vmid是程序id号,也就是jps之後看到的前面的号碼,如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

①option參數

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • 列印編譯所花費的時間次數等資訊:↓
Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • 列印被jit編譯器編譯過的方法:↓
Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

1、-class舉例:

簡單使用:↓

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

h3 中的3代表每隔3個分隔一次,

13344 代表類的程序id,

1000 代表每隔1000毫秒列印一次,

10 代表一共列印10次,

如下所示:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

Timestamp代表:程式至今的運作時間,機關為秒;

Loaded代表:加載的類的數目;

Bytes代表:加載的類的總位元組數;

Unloaded代表:解除安裝的類的數目;

Bytes代表:解除安裝的類的總位元組數;

Time代表:類裝載所消耗的時間;

2、-gc舉例:

13344代表類的程序id,執行結果如下所示:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

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:代表垃圾回收的總時間

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

3、-gccapacity舉例:

13344代表類的程序id,執行結果如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

其中S0C代表幸存者0區的容量,S1C代表幸存者1區的容量,EC代表伊甸園區的容量,CCSC代表壓縮類的容量,YGC代表年輕代垃圾回收的時間,FGC代表Full GC垃圾回收的時間

4、-gcutil舉例:

檢視堆記憶體空間占比情況

13152代表類的程序id,執行結果如下所示:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

以上是

各區域占比以及垃圾回收的情況

,S0代表幸存者0區,S1代表幸存者1區,E代表伊甸園區,O代表老年代,M代表方法區,CCS代表壓縮類,以上這些值都是占比情況,YGC代表年輕代垃圾回收的次數,YGCT年輕代進行垃圾回收需要的時間,FGC代表代表Full GC的次數,FGCT代表Full GC的時間,GCT代表垃圾回收的總時間

5、-gccause舉例:

發生GC的原因

13344代表類的程序id,執行結果如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

以上是

各區域占比以及垃圾回收的情況,還有觸發垃圾回收的原因解釋

,S0代表幸存者0區,S1代表幸存者1區,E代表伊甸園區,O代表老年代,M代表方法區,CCS代表壓縮類,以上這些值都是占比情況,YGC代表年輕代垃圾回收的次數,YGCT年輕代進行垃圾回收需要的時間,FGC代表代表Full GC的次數,FGCT代表Full GC的時間,GCT代表垃圾回收的總時間,LGCC和GCC代表垃圾回收的原因

②interval參數

用于指定輸出統計資料的周期,機關為毫秒。即:

查詢間隔

,每個多少時間查詢一次

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

③count參數

用于

指定查詢的總次數

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

④-t參數

可以在輸出資訊前加上一個Timestamp列,顯示程式的運作時間。機關:秒

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

經驗:↓

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

執行jstat -gc -t 13152 1000 10,這代表1秒列印出1行,一共10行,-t代表列印出Timestamp總運作時間,結果如下所示:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

上方紅色框框中代表Timestamp,而藍色框框中代表垃圾回收時間,機關都是秒,如果讓紅色框框中的某兩個值相減,假設這個值是num1,然後讓對應行的藍色框框中的另外兩個值相減,假設這個值是num2,之後讓num2/num1,得出的內插補點就是上述所說的GC時間占運作時間的比例

雖然這種方式比較繁瑣,但是在項目部署之後就需要使用指令行去看了,就沒有可視化界面了,是以這種方式也要會

左側的是通過

-t

,知道程式執行的時間,兩段可以相減算出這段時間内右側GC時間相減獲得這段時間的GC時間,右側除以左側,就可以算出垃圾回收時間占這段程式執行時間的比例,如果

比例超過20%

,就表明堆的壓力比較大了

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

⑤-h參數

可以在周期性資料輸出時,輸出多少行資料後輸出一個表頭資訊

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

3、補充

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

第1步可以執行指令:

jstat -gc -t 14024 1000 10

一段時間内抽取OU中的最小值,進行比較,如果發現不斷上漲,就出現記憶體洩露

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

四、jinfo:實時檢視和修改JVM配置參數

主要用來擷取某一個參數的值,修改比較少

1、基本情況

Bean對象get/set()

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

2、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

①檢視

  • jinfo -sysprops 程序id

可以檢視由System.getProperties()取得的參數

程序id可以通過jps指令檢視,操作結果如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • jinfo -flags 程序id

檢視目前程序曾經賦過值的一些參數情況

程序id可以通過jps指令檢視,參數指派的一部分是我們自己設定的,另外一部分是系統自動優化設定的參數資訊,具體操作如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • jinfo -flag 參數名稱 程序id

檢視某個java程序的具體參數的資訊

程序id可以通過jps指令檢視

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

②修改

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • 針對boolean類型
jinfo -flag [+|-]參數名稱 程序id
           

PID可以通過jps指令檢視,如果使用+号,那就可以讓該參數起作用,否則使用-号就讓該參數不起作用

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • 針對非boolean類型
jinfo -flag 參數名稱=參數值 程序id
           

PID可以通過jps指令檢視,如果使用+号,那就可以讓該參數起作用,否則使用-号就讓該參數不起作用

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

3、拓展

①java -XX:+PrintFlagsInitial

檢視所有JVM參數啟動的

初始值

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

②java -XX:+PrintFlagsFinal

檢視所有JVM參數的

最終值

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

③java -參數名稱:+PrintCommandLineFlags

檢視那些已經被使用者或者JVM設定過的詳細的XX參數的名稱和值

五、jmap:導出記憶體映像檔案&記憶體使用情況

關注更多

堆空間

的情況

1、基本情況

jvm

記憶體映射

将某個階段的記憶體情況映射成一個快照檔案

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

生成的dump檔案是不能通過記事本直接打開的,因為他是二進制檔案

2、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

1、使用文法可以通過在DOS視窗中使用jmap/jmap -h/jmap -help檢視

2、代表可執行的代碼,比如使用> 檔案名稱來指定生成的dump檔案的生成位置

3、[server_id@]是為遠端連接配接準備的

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

3、使用1:導出記憶體映像檔案

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

注意:

  1. 對于以上說明中的第1點是自動方式才會這樣做,而手動不會在Full GC之後生成Dump
  2. 使用手動方式生成dump檔案,一般指令執行之後就會生成,不用等到快出現OOM的時候
  3. 使用自動方式生成dump檔案,當出現OOM之前先生成dump檔案
  4. 如果使用手動方式,一般使用第2種,畢竟生成堆中存活對象的dump檔案是比較小的,便于傳輸和分析

①手動的方式

說明:

  1. 中的

    filename是檔案名稱

    ,而

    .hprof是字尾名

    ,代表該值可以省略,當然後面的是程序id,需要通過jps查詢出來
  2. format=b表示生成的是标準的dump檔案

    ,用來進行格式限定

生成堆中所有對象的快照:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

生成堆中存活對象的快照:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

其中

file

=後面的是生成的dump檔案位址,最後的11696是程序id,可以通過jps檢視

一般使用的是第二種方式,也就是生成堆中存活對象的快照

,畢竟這種方式生成的dump檔案更小,我們傳輸處理都更友善

jmap -dump:format=b,file=<filename.hprof> < pid > #生成堆中所有對象的快照
jmap -dump:live,format=b,file=<filename.hprof> < pid > #生成堆中存活對象的快照
           
Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

②自動的方式

在快要發生OOM之前,自動生成dump檔案

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

具體使用如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>

#比如
-Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:heapDumpPath=D:\m.hprof
           

4、使用2:顯示堆記憶體相關資訊

擷取展示運作指令的

這一刻

的堆記憶體情況,且傳回的資料必然是在

安全點上

①jmap -heap 程序id

jmap -heap 程序id隻是時間點上的堆資訊,而jstat後面可以添加參數,可以指定時間動态觀察資料改變情況,而圖形化界面工具,例如jvisualvm等,它們可以用圖表的方式動态展示出相關資訊,更加直覺明了

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

②jmap -histo 程序id

輸出堆中對象的同級資訊,包括類、執行個體數量和合計容量,也是這一時刻的記憶體中的對象資訊

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

5、使用3:其他作用

這兩個指令僅linux/solaris平台有效,是以無法在windows操作平台上示範,并且使用比較小衆,不在多說

  • jmap -permstat 程序id

檢視系統的ClassLoader資訊

  • jmap -finalizerinfo

檢視堆積在finalizer隊列中的對象

6、小結

因為他jmap所擷取到的資料是借助安全點的,是以會出現資料結果的偏差情況

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

六、jhat:JDK自帶堆分析工具

去分析用jmap導出的dump檔案

jhat指令在jdk9及其之後就

被移除

了,官方建議使用jvisualvm代替jhat,是以該指令隻需簡單了解一下即可

1、基本情況

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

2、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

其中dumpfile代表dump檔案的位址以及名稱,例如:

  • options參數
Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

舉例如下:

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

提供了端口為7000的一個界面:↓

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

七、jstack:列印JVM中線程快照

列印單獨jvm程序中的所有

線程

的狀态快照

1、基本情況

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

2、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

總結:

如果程式出現等待問題,可以使用該指令去檢視問題所在,結果中也會提示你問題所在

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

八、jcmd:多功能指令行

一個頂多個,真的很強,終極縫合怪

1、基本情況

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

2、基本文法

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇
  • jcmd 程序号 具體指令

首先通過jcmd 程序号 help得出以下指令清單:

根據以上指令來替換之前的那些操作:

  1. Thread.print 可以替換 jstack指令
  2. GC.class_histogram 可以替換 jmap中的-histo操作
  3. GC.heap_dump 可以替換 jmap中的-dump操作
  4. GC.run 可以檢視GC的執行情況
  5. VM.uptime 可以檢視程式的總執行時間,可以替換jstat指令中的-t操作
  6. VM.system_properties 可以替換 jinfo -sysprops 程序id
  7. VM.flags 可以擷取JVM的配置參數資訊
  8. 等…
Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇

九、jstatd:遠端主機資訊收集

Day356.JVM監控及診斷工具-指令行 -JVMJVM監控及診斷工具-指令行篇