1. 程式人生 > >JVM 虛擬機器監控 命令

JVM 虛擬機器監控 命令

 jps :打印出所有正在執行 的java程序的相關資訊。

  • jps 列印的資訊包含java程序ID和主類名。-l 打印出主類所在的包名。

$jps -l
320 sun.tools.jps.Jps
118 org.apache.catalina.startup.Bootstrap
  • -m 傳給主類的引數 -v 傳給java虛擬機器的引數
  • $ jps -mlv
    3210 sun.tools.jps.Jps -mlv -Denv.class.path=/opt/java/jdk1.8.0_172/lib/ -Dapplication.home=/opt/java/jdk1.8.0_172 -Xms8m
    

     

  • 注意:如果java程序開啟了UsePerfData引數(XX: - UsePerfData),則這些命令則無法探知java程序。
  • jstat : java程序效能相關資訊。具體命令資訊官網: https://docs.oracle.com/en/java/javase/11/tools/jstat.html#GUID-5F72A7F9-5D5A-4486-8201-E1D1BA8ACCB5
    $ jstat -options
    -class  // 列印類載入相關資訊
    -compiler //即時編譯相關資訊
    -gc     // 列印gc相關資訊
    -gccapacity
    -gccause
    -gcmetacapacity
    -gcnew
    -gcnewcapacity
    -gcold
    -gcoldcapacity
    -gcutil
    -printcompilation // 即時編譯先關資訊
    
  • jstat 一般只會執行一次,按照如下命令可以指定執行次數。
    # Usage: jstat -outputOptions [-t] [-hlines] VMID [interval [count]]
    $ jstat -gc 11978 1s 3
    // KB 單位
    // s0C  代表第一個survivor區總容量,     S1C 代表第二個。
    // S0U  代表第一個survivor區已使用總容量 S1U 代表第二個
    // EC   代表Eden區總容量,就是年輕代      EU 代表已使用容量
    // OC   代表Old區總容量,就是年老代。     OU 代表已使用容量
    // MC   代表元資料區總容量就是永久代      MU 代表已使用容量
    // CCSC 代表壓縮類空間容量             CCMU 代表已使用容量
    // YGC  代表年輕代垃圾回收次數    
    // YGCT 代表年輕代垃圾回收時間 
    // FGC  FULL GC  次數,就是指對整個java堆進行垃圾回收,包括年輕代和年老代
    // FGCT  FULL GC 回收時間
    // GCT  總的垃圾回收消耗的時間    
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    512.0  512.0   32.0   0.0   15360.0   8579.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    512.0  512.0   32.0   0.0   15360.0   8579.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    512.0  512.0   32.0   0.0   15360.0   8579.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    

     

  • -t  一個常用的引數,可以打印出java程序啟動的時間。下面標識該java程序啟動了1977311.4秒。
    $ jstat -gc -t  11978
    Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    1977311.4        512.0  512.0   32.0   0.0   15360.0  13481.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    

     

  • 這樣就可以判斷出GC 時間佔用執行時間比例,超過20%則說明堆壓力較大,超過90%則很可能會發生ooM.多次監控年老代的OU 列則可以看出是否發生記憶體洩漏,即OU不斷在增長。

jmap : 分析堆中物件的狀態 

  • 官方幫助文件:https://docs.oracle.com/en/java/javase/11/tools/jmap.html#GUID-D2340719-82BA-4077-B0F3-2803269B7F41
  • 子命令:
    -clstats  列印類載入資訊
    
    -finalizerinfo 列印所有待finalizer 的物件
    
    -histo  列印各個類的例項數目及佔用記憶體,並按照記憶體使用量降序排序。
    
    -histo:live  列印堆中存活物件資訊
    
    -dump  匯出java虛擬機器記憶體快照,常用也是-dump:live 只儲存存活物件
    

     

  • 常用命令 jmap  -dump:live ,format = b, the file = filename. Bin 匯出到一個檔案裡進行檢視。
    打印出的資訊一部分:
    
    $ jmap -histo 978
     num        #instances         #bytes  class name (module) 
    
    1543:             1             16  sun.security.x509.RFC822Name
    1544:             1             16  sun.text.normalizer.NormalizerBase$Mode
    1545:             1             16  sun.text.normalizer.NormalizerBase$NFCMode
    1546:             1             16  sun.text.normalizer.NormalizerBase$NFDMode
    1547:             1             16  sun.text.normalizer.NormalizerBase$NFKCMode

     

  • jinfo :用來檢視java程序的引數  

  • 官方文件:https://docs.oracle.com/en/java/javase/11/tools/jinfo.html#GUID-69246B58-28C4-477D-B375-278F5F9830A5
  • 具體來看就是傳給虛擬機器的一些引數,比如 -XX  可以看到自己設定的或者預設設定一些資訊。
    $ jinfo 119
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.172-b11
    Java System Properties:
    
    ...
    ...
    ...
    
    VM Flags:
    Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=482344960 -XX:MaxNewSize=160432128 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=10485760 -XX:OldSize=20971520 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
    
    
    

     

  • jstack :列印程序的各個執行緒的資訊,包括執行緒的鎖。

  • 官方文件:https://docs.oracle.com/en/java/javase/11/tools/jstack.html#GUID-721096FC-237B-473C-A461-DBBBB79E4F6A
  • 那這裡就可以使用jstack來進行死鎖檢查。
  • 一個死鎖:來自於鄭雨笛老師
    $ jstack 31634
    ...
    
    "Thread-0" #12 prio=5 os_prio=31 cpu=1.32ms elapsed=34.24s tid=0x00007fb08601c800 nid=0x5d03 waiting for monitor entry  [0x000070000bc7e000]
       java.lang.Thread.State: BLOCKED (on object monitor)
     at DeadLock.foo(DeadLock.java:18)
     - waiting to lock <0x000000061ff904c0> (a java.lang.Object)
     - locked <0x000000061ff904b0> (a java.lang.Object)
     at DeadLock$$Lambda$1/0x0000000800060840.run(Unknown Source)
     at java.lang.Thread.run([email protected]/Thread.java:834)
    
    "Thread-1" #13 prio=5 os_prio=31 cpu=1.43ms elapsed=34.24s tid=0x00007fb08601f800 nid=0x5f03 waiting for monitor entry  [0x000070000bd81000]
       java.lang.Thread.State: BLOCKED (on object monitor)
     at DeadLock.bar(DeadLock.java:33)
     - waiting to lock <0x000000061ff904b0> (a java.lang.Object)
     - locked <0x000000061ff904c0> (a java.lang.Object)
     at DeadLock$$Lambda$2/0x0000000800063040.run(Unknown Source)
     at java.lang.Thread.run([email protected]/Thread.java:834)
    
    ...
    
    JNI global refs: 6, weak refs: 0
    
    
    Found one Java-level deadlock:
    =============================
    "Thread-0":
      waiting to lock monitor 0x00007fb083015900 (object 0x000000061ff904c0, a java.lang.Object),
      which is held by "Thread-1"
    "Thread-1":
      waiting to lock monitor 0x00007fb083015800 (object 0x000000061ff904b0, a java.lang.Object),
      which is held by "Thread-0"
    
    Java stack information for the threads listed above:
    ===================================================
    "Thread-0":
     at DeadLock.foo(DeadLock.java:18)
     - waiting to lock <0x000000061ff904c0> (a java.lang.Object)
     - locked <0x000000061ff904b0> (a java.lang.Object)
     at DeadLock$$Lambda$1/0x0000000800060840.run(Unknown Source)
     at java.lang.Thread.run([email protected]/Thread.java:834)
    "Thread-1":
     at DeadLock.bar(DeadLock.java:33)
     - waiting to lock <0x000000061ff904b0> (a java.lang.Object)
     - locked <0x000000061ff904c0> (a java.lang.Object)
     at DeadLock$$Lambda$2/0x0000000800063040.run(Unknown Source)
     at java.lang.Thread.run([email protected]/Thread.java:834)
    
    Found 1 deadlock.
    

     

  • jcmd :可以實現除了jstat 以外以上所有的命令

  • 官方文件:https://docs.oracle.com/en/java/javase/11/tools/jcmd.html#GUID-59153599-875E-447D-8D98-0078A5778F05
  • 總結:
    • jps  列印所有java程序Id及一些相關的資訊,比如主類,主類所在的包等
    • jstat  列印java程序的的類載入及gc資訊
    • jmap  列印物件的資訊,比如類的例項數目,類所有例項佔用記憶體大小。常用來檢視佔用記憶體過大的物件。
    • jinfo 列印java程序的配置引數,常用的-XX 及各種設定的引數。也可以修改引數值
    • jstack  列印java程序的各個執行緒資訊,及執行緒的鎖。喲哪裡檢測死鎖
    • jcmd  實現出jstat以外的上述功能