天天看點

java排錯_java監控排錯學習筆記

jvm monitor tool learn

監控內建工具

VisualVm

jConsole

jdk 監控指令

jps 檢視運作的java程序

jps -m -l -v

-m 輸出傳入main方法的參數

-l 輸出main類或jar的全限名

-v 輸出傳入的jvm參數

/opt/running # jps -lmv

1 bootshiro.jar --spring.profiles.active=prod

97 jdk.jcmd/sun.tools.jps.Jps -lmv -Dapplication.home=/opt/openjdk-12 -Xms8m -Djdk.module.main=jdk.jcmd

jstack 檢視java程序的線程dump

jstack -l -e

-l 長清單,列印鎖附加資訊

-e 擴充清單,列印線程附件資訊

java程序ID,通過jps檢視

/opt/running # jstack -l -e 1

2020-02-20 13:17:23

Full thread dump OpenJDK 64-Bit Server VM (12-ea+29 mixed mode, sharing):

jmap dump轉儲堆棧資訊

jmap -dump:live,format=b,file=heap.hprof

-dump:live 轉儲活動的對象,如果不指定(去掉live)就是所有對象

format=b 二進制格式

file=heap.bin 轉儲生成檔案heap.bin

java程序ID

/opt/running # jmap -dump:,format=b,file=heap.hprof 1

Heap dump file created

轉儲生成的dump檔案可以導入VisualVm,jConsole或者jhat指令檢視

/opt/running # jhat heap.hprof

Reading from heap.bin...

Dump file created Thu Feb 20 21:29:23 CST 2020

Snapshot read, resolving...

Resolving 660870 objects...

Chasing references, expect 132 dots...

Eliminating duplicate references...

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

通過localhost:7000檢視

jstat JVM統計監測工具

jstat --help|-options

jstat - [-h] [ []]

- 選項,通過jstat -options擷取

[-h] 可選項,表示多少行之後再次列印頭部資訊

監控的java程序ID

[] 可選項,列印間隔,表示每隔多少ms列印一次資訊

[] 可選項,列印次數,表示列印幾次就停止

下面表示: 分析程序ID為1的程序的GC情況,2行之後就再次列印頭部,每隔2秒列印一次,總列印4次

/opt/running # jstat -gc -h2 1 2000 4

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT

2816.0 2816.0 0.0 597.8 22528.0 18711.1 56028.0 33616.4 80680.0 78501.6 9336.0 8607.4 1553 5.452 4 0.757 - - 6.209

2816.0 2816.0 0.0 597.8 22528.0 18711.1 56028.0 33616.4 80680.0 78501.6 9336.0 8607.4 1553 5.452 4 0.757 - - 6.209

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT

2816.0 2816.0 0.0 597.8 22528.0 18711.1 56028.0 33616.4 80680.0 78501.6 9336.0 8607.4 1553 5.452 4 0.757 - - 6.209

2816.0 2816.0 0.0 597.8 22528.0 18711.1 56028.0 33616.4 80680.0 78501.6 9336.0 8607.4 1553 5.452 4 0.757 - - 6.209

檢視option選項有哪些可選參數

/opt/running # jstat -options

-class 顯示加載的class數量,所占空間,耗時

-compiler 顯示編譯的數量,失敗,失敗的内容等資訊

-gc (頻繁)顯示GC資訊,年輕代,老年代,gc次數等資訊

-gccapacity 顯示年輕代老年代永久代的記憶體占用大小等資訊

-gccause (頻繁)顯示最近一次GC資訊和GC原因

-gcmetacapacity 顯示元空間容量資訊

-gcnew 顯示年輕代資訊

-gcnewcapacity 顯示年輕代資訊及占用量

-gcold 顯示老年代資訊

-gcoldcapacity 顯示老年代資訊及占用量

-gcutil 顯示GC的統計資訊

/opt/running # jstat -gc -h2 1 2000 4

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT

2816.0 2816.0 0.0 597.8 22528.0 18711.1 56028.0 33616.4 80680.0 78501.6 9336.0 8607.4 1553 5.452 4 0.757 - - 6.209

jstat -gc

參數解釋

S0C

年輕代8:1:1的第一個幸存區

S1C

年輕代8:1:1的第二個幸存區

S0U

第一個幸存區使用大小

S1U

第二個幸存區使用大小

EC

年輕代8:1:1中的伊甸園大小

EU

伊甸園使用大小

OC

老年代大小

OU

老年代使用大小

MC

方法區(元空間)大小

MC

方法區(元空間)使用大小

CCSC

壓縮類空間??大小 壓縮類

CCSU

壓縮類空間使用大小

YGC

發生的young gc次數

YGCT

young gc所耗時間

FGC

發生的full gc次數

FGCT

full gc所耗時間

CGC

并發垃圾搜集次數(G1垃圾搜集器)

CGCT

并發垃圾搜集耗時

GCT

總耗gc時間

分析java占用cpu或記憶體高的線程

top 檢視高記憶體或高cpu的程序pid(大寫P排序cpu,大寫M排序記憶體)

jps 檢視要看的java程序pid

top -Hp 列出該pid程序下的所有線程資訊(清單中PID為線程十進制id)

通過(大寫P排序cpu,大寫M排序記憶體)查出占用高的線程id

printf "%x\n" 轉16進制

jstack | grep 檢視該線程堆棧

jvm奔潰hs_err_pid.log分析

預設目前在工作目錄,通過 -XX:ErrorFile=/opt/log/hs_err_pid.log 設定生成路徑

jvm監控相關好文