JVM 監控工具

JVM 監控工具html

官方手冊:https://docs.oracle.com/javase/8/docs/technotes/tools/index.htmljava

1、命令行監控工具

1. jps(JVM Process Status Tool)

功能: 列出正在運行的虛擬機並顯示虛擬機執行主類名稱web

主要參數:apache

-q: 只顯示進程ID
-m: 顯示傳遞給main方法的參數
-l: 顯示應用程序mian方法名稱或jar文件的路徑名
-v: 顯示傳遞給JVM虛擬機的參數ubuntu

實例:瀏覽器

  1. 列出正在運行的jvm進程id
$ jps
16420 Bootstrap
32375 Jps
  1. 顯示傳遞給JVM虛擬機的參數
$ jps  -v
16420 Bootstrap -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp
32333 Jps -Denv.class.path=.:/home/ubuntu/software/jdk/jdk1.8.0_151/lib:/home/ubuntu/software/jdk/jdk1.8.0_151/jre/lib -Dapplication.home=/home/ubuntu/software/jdk/jdk1.8.0_151 -Xms8m

2. jstat(JVM Statistics Monitoring Tool)

功能: 監視虛擬機各類運行狀態信息,能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據tomcat

命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]bash

選項 做用
-class 監視類裝載、卸載數量、總空間以及類裝載所消耗的時間
-compiler 輸出JIT編譯器編譯過的方法和、耗時
-gc 監視Java堆情況
-gccapacity 監視內容與-gc基本相同,主要關注java堆各個區域使用到的最大、最小空間
-gccause 與-gcutil功能相同,灰額外輸出致使上一次GC產生的緣由
-gcmetacapacity 監視元空間
-gcnew 監視新生代GC狀況
-gcnewcapacity 監視內容與-gcnew相同,輸出主要關注使用到的最大、最小空間
-gcold 監視老年代GC狀況
-gcoldcapacity 監視內容與-gcold相同,輸出主要關注使用到的最大、最小空間
-gcutil 監視內容與-gc基本相同,主要關注已使用空間佔總空間的百分比
-printcompilation 輸出已經被JIT編譯的方法
  1. -class
$ jstat -class 16420
# 加載的類數 大小(Kb) 卸載的類數   大小(Kb) 執行類加載和卸載操做花費的時間
Loaded     Bytes     Unloaded  Bytes     Time
 15096   30199.4        3       4.6      15.34
  1. -gc
$ jstat -gc 16420
# 單位是KB
# survivor0容量 survivor1容量 survivor0使用 survivor1使用  Eden容量  Eden使用   OLD容量     OLD使用    元空間容量 元空間使用 壓縮類空間容量 壓縮類空間使用  年輕代GC數量 年輕代GC時間  Full GC數量  Full GC時間 GC總時間
    S0C          S1C            S0U          S1U            EC       EU        OC         OU       MC        MU         CCSC      CCSU         YGC          YGCT         FGC       FGCT        GCT
  29696.0     28160.0         560.5          0.0        1339904.0 124539.0 2796544.0   144642.9  99072.0   89527.5   12544.0     10189.7        42         0.550          5       0.566       1.116
  1. -gccapacity
$ jstat -gccapacity  16420
# 最小新生代容量 最大新生代容量 當前新生代容量 survivor0容量 survivor1容量  Eden容量  最小老年代容量 最大老年代容量  當前老年代容量 老年代空間容量  最小元空間容量 最大元空間容量  元空間大小 最小壓縮類空間容量 最大壓縮類空間容量 壓縮類空間容量 年輕代GC數量 FUll GC數量
 NGCMN          NGCMX         NGC         S0C          S1C           EC          OGCMN        OGCMX       OGC           OC         MCMN        MCMX          MC        CCSMN          CCSMX          CCSC           YGC           FGC
1397760.0     1397760.0    1397760.0    29696.0      28160.0     1339904.0      2796544.0  2796544.0   2796544.0     2796544.0      0.0      1136640.0     99072.0      0.0         1048576.0       12544.0          42            5

關於OGC和GC的區別:https://stackoverflow.com/questions/11253285/jstat-difference-between-ogc-oc-pgc-pc
OGC = sum(all OC),可是HotShot中old space只有一個服務器

  1. -gcutil
$ jstat -gcutil  16420
# Survivor0使用比 Survivor0使用比 Eden使用比 OLD使用比  元空間使用比  壓縮類使用比 年輕代GC數量  
       S0              S1           E      O           M         CCS       YGC         YGCT    FGC    FGCT     GCT
      1.89           0.00         16.46   5.17       90.37      81.23       42         0.550     5    0.566    1.116
  1. -gccause
# jstat -gccause  16420
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
  1.89   0.00  17.20   5.17  90.37  81.23     42    0.550     5    0.566    1.116 Allocation Failure   No GC
  1. 持續監控

隔2秒監控一次堆使用狀況,監測5次websocket

$ jstat -gcutil  16420 2000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116

2、圖形化監控工具

1. jconsole

3. jvisualvm

3、調試工具

1. jinfo

功能:實施查看和調整虛擬機參數

命令格式

jinfo [option] <pid>
參數:
    -flag <name>         打印虛擬機參數的值
    -flag [+|-]<name>    啓用或關閉虛擬機參數
    -flag <name>=<value> 設置虛擬機參數
    -flags               打印虛擬機參數
  1. 查看指定參數的值
$ jinfo -flag  InitialHeapSize   16420
-XX:InitialHeapSize=4294967296
  1. 查看虛擬機參數
jinfo -flags 16420
Attaching to process ID 16420, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=4294967296 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1431306240 -XX:OldSize=2863661056 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:  -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp

2. jmap

功能: 生成堆轉儲快照,查詢finalize執行隊列、Java堆詳細信息、當前使用的那種收集器

主要選擇
選擇 | 做用
---|---
-heap | 顯示java堆信息,如使用哪一種回收器、參數配置、分代狀況
-histo | 顯示堆中對象統計信息,包括類、實例數量、合計容量
-dump | 生成java堆轉儲快照
-clstats | 打印Java堆的類加載器的統計信息。對於每一個類加載器,它的名稱,它的活動程度,地址,父類加載器以及它加載的類的數量和大小都會被打印出來。
-finalizerinfo | 打印有關正在等待最終肯定的對象的信息
-F | 當虛擬機進程沒有響應時強制生成dump快照

  1. 打印java堆信息
# 須以root用戶執行
$ jmap -J-d64 -heap 16420
Attaching to process ID 16420, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12

using thread-local object allocation.
Parallel GC with 8 thread(s)    # 垃圾收集器

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 1431306240 (1365.0MB)
   MaxNewSize               = 1431306240 (1365.0MB)
   OldSize                  = 2863661056 (2731.0MB)
   NewRatio                 = 2                         # 老年代佔據堆的2/3,新生代佔據1/3
   SurvivorRatio            = 8                         # Survivor:Eden=1:8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:     # Eden區內存分佈
   capacity = 1378353152 (1314.5MB)
   used     = 74006280 (70.57788848876953MB)
   free     = 1304346872 (1243.9221115112305MB)
   5.36918132284287% used
From Space:      # 其中一個Survivor區的內存分佈           
   capacity = 27262976 (26.0MB)
   used     = 0 (0.0MB)
   free     = 27262976 (26.0MB)
   0.0% used
To Space:        # 另外一個Survivor區的內存分佈
   capacity = 25690112 (24.5MB)
   used     = 0 (0.0MB)
   free     = 25690112 (24.5MB)
   0.0% used
PS Old Generation
   capacity = 2863661056 (2731.0MB)
   used     = 60243072 (57.4522705078125MB)
   free     = 2803417984 (2673.5477294921875MB)
   2.1037081841015195% used

38423 interned Strings occupying 4154104 bytes.
  1. 顯示堆中對象統計信息
# 須以jvm啓動用戶執行該命令
$ jmap -histo:live 16420
 num     #instances         #bytes  class name
----------------------------------------------
   1:        187022       22144672  [C
   2:        185124        4442976  java.lang.String
   3:         85170        2725440  java.util.HashMap$Node
   4:         29978        2638064  java.lang.reflect.Method
   5:         40422        2440632  [Ljava.lang.Object;
   6:          6915        2123840  [B
   7:         15533        1718560  java.lang.Class
   ...         ...           ....   ...
6186:             1             16  sun.util.resources.LocaleData
6187:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
6188:             1             16  websocket.drawboard.DrawboardContextListener
Total       1186181       62814680
  1. 轉儲堆快照
$ jmap -dump:live,format=b,file=jenkins.bin 16420
Dumping heap to /home/jenkins/jenkins.bin ...
$ ll jenkins.bin  -h
-rw------- 1 jenkins jenkins 1011M 2月  14 11:43 jenkins.bin

3. jhat

功能:分析jamp生成的堆轉儲快照,jhat內置了一個微型HTTP服務器,生成dump文件的分析結果後能夠在瀏覽器查看。

通常不會在生產服務器上進行分析,很是耗CPU和內存,不經常使用

jhat jenkins.bin 
Reading from jenkins.bin...
Dump file created Thu Feb 14 11:43:45 CST 2019
Snapshot read, resolving...
Resolving 12022774 objects...
Chasing references, expect 2404 
dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

使用瀏覽器訪問http://ip:7000 查看分析結果

4.jstack

功能: 生成虛擬機當前時刻的線程快照(通常稱爲threaddump、javacore文件)

參數:
-l: 打印關於鎖的信息
-m: 打印java和native frames 的信息

  1. 使用方法
$ jstack -l 16420  > jenkins.jstack

線程的幾種狀態: 狀態 | 含義 ---|--- NEW|未啓動的,不會出如今dump中 RUNNABLE|在虛擬機內執行的。運行中狀態,可能裏面還能看到locked字樣,表面它得到了某把鎖 BLOCKED|受阻塞並等待監視器鎖。被某個鎖(synchronizers)給block住了。 WATING|無限期等待另外一個線程執行特定操做。等待某個condition或monitor發生,通常停留在park(), wait(), sleep(),join() 等語句裏。 TIMED_WATING|有時限的等待另外一個線程的特定操做。和WAITING的區別是wait() 等語句加上了時間限制 wait(timeout)。 TERMINATED|已退出的。

相關文章
相關標籤/搜索