JVM常用工具

語言: CN / TW / HK

JDK內建工具使用

  • jps(Java Virtual Machine Process Status Tool)
        檢視所有的jvm程序,包括程序ID,程序啟動的路徑等等。
  • jstack(Java Stack Trace)
        ① 觀察jvm中當前所有執行緒的執行情況和執行緒當前狀態。
        ② 系統崩潰了?如果java程式崩潰生成core檔案,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,從而可以輕鬆地知道java程式是如何崩潰和在程式何處發生問題。
        ③ 系統hung住了?jstack工具還可以附屬到正在執行的java程式中,看到當時執行的java程式的java stack和native stack的資訊, 如果現在執行的java程式呈現hung的狀態,jstack是非常有用的。
  • jstat(Java Virtual Machine Statistics Monitoring Tool)
        ① jstat利用JVM內建的指令對Java應用程式的資源和效能進行實時的命令列的監控,包括了對程序的classloader,compiler,gc情況;
        ②監視VM記憶體內的各種堆和非堆的大小及其記憶體使用量,以及載入類的數量。
  • jmap(Java Memory Map)
        監視程序執行中的jvm實體記憶體的佔用情況,該程序記憶體內,所有物件的情況,例如產生了哪些物件,物件數量;
  • jinfo(Java Configuration Info)
        觀察程序執行環境引數,包括Java System屬性和JVM命令列引數

具體命令使用:

  • jstat

    generalOption
    -help 顯示幫助資訊。
    -version 顯示版本資訊
    -options 顯示統計選項列表。
    outputOptions 
    #引數:
        -class:統計類裝載器的行為
        -compiler:統計HotSpot Just-in-Time編譯器的行為
        -gc:統計堆各個分割槽的使用情況
        -gccapacity:統計新生區,老年區,permanent區的heap容量情況 
        -gccause:統計最後一次gc和當前gc的原因
        -gcnew:統計gc時,新生代的情況 
        -gcnewcapacity:統計新生代大小和空間
        -gcold:統計老年代和永久代的行為
        -gcoldcapacity:統計老年代大小 
        -gcpermcapacity:統計永久代大小 
        -gcutil:統計gc時,heap情況 
        -printcompilation:HotSpot編譯方法統計
     
    -class:
    #每隔1秒監控一次,一共做10次
      jstat -class 17970 1000 10
    ##########################################
    [root@lq225 conf]# jstat -class 2058 1000 10
    Loaded  Bytes  Unloaded  Bytes     Time   
      1697  3349.5        0     0.0       1.79
      1697  3349.5        0     0.0       1.79
      1697  3349.5        0     0.0       1.79
      1697  3349.5        0     0.0       1.79
      ...................................................
    ######################## 術語分隔符 ########################
    #Loaded 類載入數量
    #Bytes  載入的大小(k) 
    #Unloaded 類解除安裝的數量 
    #Bytes 解除安裝的大小(k) 
    #Time 時間花費在執行類載入和解除安裝操作
    -compiler
    Compiled Failed Invalid   Time   FailedType FailedMethod
         302      0       0     1.27          0
    .....................................................
    ######################## 術語分隔符 ########################
    #Compiled 編譯任務的執行次數
    #Failed   編譯任務的失敗次數 
    #Invalid  編譯任務無效的次數
    #Time     編譯任務花費的時間
    #FailedType 最後一次編譯錯誤的型別
    #FailedMethod 最後一次編譯錯誤的類名和方法
    -gc:
    #每隔2秒監控一次,共20次
      jstat -gc 2058 2000 20
    ##############################
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
    8704.0 8704.0 805.5   0.0   69952.0  64174.5   174784.0    2644.5   16384.0 10426.7      2    0.034   0      0.000    0.034
    8704.0 8704.0 805.5   0.0   69952.0  64174.5   174784.0    2644.5   16384.0 10426.7      2    0.034   0      0.000    0.034
    8704.0 8704.0 805.5   0.0   69952.0  64174.5   174784.0    2644.5   16384.0 10426.7      2    0.034   0      0.000    0.034
    .............................................
    ######################## 術語分隔符 ########################
    #S0C 生還者區0 容量(KB)
    #S1C 生還者區1 容量(KB)
    #S0U 生還者區0 使用量(KB)
    #S1U 生還者區1 使用量(KB)
    #EC 伊甸園區容量(KB)
    #EU 伊甸園區使用量(KB) 
    #OC 老年區容量(KB)
    #OU 老年區使用量(KB)
    #PC 永久區容量(KB) 
    #PU 永久區使用量(KB)
    #YGC 新生代GC次數
    #YGCT 新生代GC時間
    #FGC full GC 事件的次數
    #FGCT full GC的時間 
    #GCT 總GC時間
    -gccapacity
    NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC
    131072.0 131072.0 131072.0 13056.0 13056.0 104960.0   393216.0   393216.0   393216.0   393216.0  65536.0  65536.0  65536.0  65536.0      1     0
    ..........................................................................................................
    ######################## 術語分隔符 ########################
    #NGCMN 最小新生代容量(KB)
    #NGCMX 最大新生代容量(KB)
    #NGC 當前新生代容量(KB)
    #S0C 當前生存者0區容量(KB)
    #S1C 當前生存者1區容量(KB)
    #OGCMN 老年代最小容量(KB)
    #OGCMX 老年代最大容量(KB)
    #OGC 當前老年代容量(KB). 
    #OC 當前老年代?Current old space capacity (KB). 
    #PGCMN 永久區最小容量(KB)
    #PGCMX 永久區最大容量(KB)
    #PGC 當前永久區容量(KB). 
    #PC 當前永久區?Current Permanent space capacity (KB). 
    #YGC young GC事件的次數 
    #FGC Full GC次數
    -gccause
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
      0.00  99.84  12.76   0.92  46.23      1    0.016     0    0.000    0.016 unknown GCCause      No GC
    ................................................
    ######################## 術語分隔符 ########################
    #S0 年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比
    #S1 年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比
    #E 年輕代中Eden(伊甸園)已使用的佔當前容量百分比
    #O old代已使用的佔當前容量百分比
    #P perm代已使用的佔當前容量百分比
    #YGC 從應用程式啟動到取樣時年輕代中gc次數
    #FGC 從應用程式啟動到取樣時old代(全gc)gc次數
    #FGCT 從應用程式啟動到取樣時old代(全gc)gc所用時間(s)
    #GCT 從應用程式啟動到取樣時gc用的總時間(s)
    #LGCC 最後一次GC的原因
    #GCC 當前GC的原因
    
    例如 -gcutil :        
    #每隔1秒監控一次,共10次
    jstat -gcutil 2058 1000 10
    ################################
    [root@lq225 conf]# jstat -gcutil 2058 1000 10
      S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
      9.25   0.00  96.73   1.51  63.64      2    0.034     0    0.000    0.034
      9.25   0.00  96.73   1.51  63.64      2    0.034     0    0.000    0.034
      9.25   0.00  96.73   1.51  63.64      2    0.034     0    0.000    0.034
      9.25   0.00  96.73   1.51  63.64      2    0.034     0    0.000    0.034
     
  • jmap
    #引數
        -dump:[live,]format=b,file=<filename> 使用hprof二進位制形式,輸出jvm的heap內容到檔案=. live子選項是可選的,假如指定live選項,那麼只輸出活的物件到檔案. 
        -finalizerinfo 列印正等候回收的物件的資訊.
        -heap 列印heap的概要資訊,GC使用的演算法,heap的配置及wise heap的使用情況.
        -histo[:live] 列印每個class的例項數目,記憶體佔用,類全名資訊. VM的內部類名字開頭會加上字首”*”. 如果live子引數加上後,只統計活的物件數量. 
        -permstat 列印classload和jvm heap長久層的資訊. 包含每個classloader的名字,活潑性,地址,父classloader和載入的class數量. 另外,內部String的數量和佔用記憶體數也會打印出來. 
        -F 強迫.在pid沒有相應的時候使用-dump或者-histo引數. 在這個模式下,live子引數無效. 
        -h | -help 列印輔助資訊 
        -J 傳遞引數給jmap啟動的jvm. 
        pid 需要被列印配相資訊的java程序id.
     
    例如 -histo :    
    jmap -histo  2058
    ############################
     num     #instances         #bytes  class name
    ----------------------------------------------
       1:           206        3585312  [I
       2:         19621        2791880  <constMethodKlass>
       3:         19621        2520048  <methodKlass>
       4:         21010        2251616  [C
    ............................................................
     
    例如 -dump:
    #生成的檔案可以使用jhat工具進行分析,在OOM(記憶體溢位)時,分析大物件,非常有用
    jmap -dump:live,format=b,file=data.hprof 2058
    
    #通過使用如下引數啟動JVM,也可以獲取到dump檔案:
     -XX:+HeapDumpOnOutOfMemoryError
     -XX:HeapDumpPath=./java_pid<pid>.hprof
    
    #如果在虛擬機器中匯出的heap資訊檔案可以拿到WINDOWS上進行分析,可以查詢諸如記憶體方面的問題,可以這麼做:
    jhat data.hprof  
    #執行成功後,訪問http://localhost:7000即可檢視記憶體資訊。(首先把7000埠開啟)
     
  • jinfo
    #檢視java程序的配置資訊
    jinfo 2058
    #####################
    Attaching to process ID 2058, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.0-b56
    Java System Properties:
    
    java.runtime.name = Java(TM) SE Runtime Environment
    project.name = Amoeba-MySQL
    java.vm.version = 24.0-b56
    sun.boot.library.path = /usr/local/java/jdk1.7/jre/lib/amd64
    ................................................
    
    # 檢視2058的MaxPerm大小可以用
     jinfo -flag MaxPermSize 2058
    ############################
    -XX:MaxPermSize=100663296
     
  • jps
    #列出系統中所有的java程序
      jps
    #######################
    2306 Bootstrap
    3370 Jps 2058 xxxxxxxxx
    一些術語的中文解釋
    S0C:年輕代中第一個survivor(倖存區)的容量 (位元組)
    S1C:年輕代中第二個survivor(倖存區)的容量 (位元組)
    S0U:年輕代中第一個survivor(倖存區)目前已使用空間 (位元組)
    S1U:年輕代中第二個survivor(倖存區)目前已使用空間 (位元組)
    EC:年輕代中Eden(伊甸園)的容量 (位元組)
    EU:年輕代中Eden(伊甸園)目前已使用空間 (位元組)
    OC:Old代的容量 (位元組)
    OU:Old代目前已使用空間 (位元組)
    PC:Perm(持久代)的容量 (位元組)
    PU:Perm(持久代)目前已使用空間 (位元組)
    YGC:從應用程式啟動到取樣時年輕代中gc次數
    YGCT:從應用程式啟動到取樣時年輕代中gc所用時間(s)
    FGC:從應用程式啟動到取樣時old代(全gc)gc次數
    FGCT:從應用程式啟動到取樣時old代(全gc)gc所用時間(s)
    GCT:從應用程式啟動到取樣時gc用的總時間(s)
    NGCMN:年輕代(young)中初始化(最小)的大小 (位元組)
    NGCMX:年輕代(young)的最大容量 (位元組)
    NGC:年輕代(young)中當前的容量 (位元組)
    OGCMN:old代中初始化(最小)的大小 (位元組) 
    OGCMX:old代的最大容量 (位元組)
    OGC:old代當前新生成的容量 (位元組)
    PGCMN:perm代中初始化(最小)的大小 (位元組) 
    PGCMX:perm代的最大容量 (位元組)   
    PGC:perm代當前新生成的容量 (位元組)
    S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比
    S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比
    E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比
    O:old代已使用的佔當前容量百分比
    P:perm代已使用的佔當前容量百分比
    S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (位元組)
    S1CMX:年輕代中第二個survivor(倖存區)的最大容量 (位元組)
    ECMX:年輕代中Eden(伊甸園)的最大容量 (位元組)
    DSS:當前需要survivor(倖存區)的容量 (位元組)(Eden區已滿)
    TT: 持有次數限制
    MTT : 最大持有次數限制

使用visualvm監控tomcat

  • 修改catalina.sh,新增下面一行:
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=192.168.55.255  -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    
    #注意點:
    #1、用hostname -i 檢視是否為127.0.01,如果是,則必須配置-Djava.rmi.server.hostname為本機IP。
    #2、檢查防火牆(iptables)是否開啟,以及是否開放jmxremote.port所指定的埠。