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 <pid>
-l      長列表,打印鎖附加信息
-e      擴展列表,打印線程附件信息
<pid>   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 <pid>
-dump:live       轉儲活動的對象,若是不指定(去掉live)就是全部對象
format=b         二進制格式
file=heap.bin    轉儲生成文件heap.bin
<pid>            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 -<option> [-h<lines>] <vmid> [<interval> [<count>]]
-<option>     選項,經過jstat -options獲取
[-h<lines>]   可選項,表示多少行以後再次打印頭部信息
<vmid>        監控的java進程ID
[<interval>]  可選項,打印間隔,表示每隔多少ms打印一次信息
[<count>]     可選項,打印次數,表示打印幾回就中止

下面表示: 分析進程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進程下的全部線程信息(列表中PID爲線程十進制id)
  • 經過(大寫P排序cpu,大寫M排序內存)查出佔用高的線程id
  • printf "%x\n" <threadId>轉16進制
  • jstack <pid> | grep <threadId> 查看該線程堆棧

jvm奔潰hs_err_pid.log分析

jvm監控相關好文

轉載請註明 from tomsun28html

相關文章
相關標籤/搜索