JVM—命令(jps,jstat,jmap,jstack)

一般用於tomcat異常場景使用:

OOM, 線程死鎖(lock dead),鎖爭用(lock contention),java消耗過多cpu等

一般使用分析命令有:

jps #查看運行java進程
jstat -gc PID #查看進程PID新生代老年代內存使用情況,年輕老年代垃圾回收次數以及時間
jstat -gccause PID #查看進程垃圾收集原因
jmap -heap PID #查看進程堆內存具體使用情況
jstack -l PID #查看線程信息,用於分析線程爭取,死鎖造成tomcat假死情況 

1. jps (JVM Process Status Tool)顯示指定系統所有的HotSpot虛擬機進程

命令格式 jps [options] [hostid]
options參數 描述
-l 輸出主類全名或jar路徑
-p 只輸出LVMID(本地虛擬機進程ID)
-m 輸出JVM啓動時傳遞給main()的參數
-v 輸出jvm啓動時顯示指定的jvm參數

 

 

 

 

2. jstat (JVM statistics Monitoring) 用於監視虛擬機運行時狀態信息的命令,它可以顯示出虛擬機進程中的類裝載,內存,垃圾收集,JIT編譯等運行數據

命令格式 jstat [option] LVMID [interval] [count]    :interval 連續輸出的時間間隔,count 連續輸出次數
option參數 描述
class class loader的行爲統計
compiler HotSpt JIT編譯器行爲統計
gc 垃圾回收堆的行爲統計
gccapacity 各個垃圾回收代容量(young,old,perm)和他們相對應的空間統計
gcutil 垃圾回收統計概述
gccause 垃圾收集統計概述-同gcutil ,附加最後兩次垃圾回收時間的原因
gcnew 新生代行爲統計
gcnewcapacity 新生代與其相應的空間內存的統計
gcold 老年代和永生代行爲統計
gcoldcapacity 老年代與其相應的空間內存的統計
gcpermcapacity 永生代與其相應的空間內存統計
printcompilation HotSpot編譯方法統計

 

 

 

 

 

 

 

 

 

    2.1 -class 監控類裝載,卸載數量,總空間以及消耗時間

 jstat -class 5280
 Loaded  Bytes  Unloaded  Bytes     Time   
 15982 31281.3      664  1118.1      39.24

Loaded: 加載class的數量

Bytes: class字節大小

Unloaded:未加載class的數量

Bytes: 未加載class的字節大小

Time:加載時間

    2.2 -compiler 輸出JIT編譯過的方法數量,耗時等,

 jstat -compiler 5280
 Compiled Failed Invalid   Time   FailedType FailedMethod
   25611      0       0   195.27          0             

Compiled-編譯數量;Failed-編譯失敗數量;Invalid-無效數量;Time-編譯耗時;FailedType-失敗類型;FailedMethod-失敗方法的全限定名。

    2.3 -gc 垃圾回收堆的行爲統計(C-總容量;U-使用容量)

jstat -gc 5280
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3584.0 1024.0  0.0   730.0  212480.0 79814.8   273408.0   201376.5  106456.0 94237.2 13272.0 10362.5   2399   26.589   7     28.622   55.211

     S0C,S1C:表示第一個和第二個生存區的容量
     S0U,S1U:表示第一個和第二個生存區的已使用的容量
     EC,EU:表示eden區域的容量和已用量
     OC,OU:表示老年代區的容量和已用量
     PC,PU:表示持久代的內存容量和已用量
     YGC,YGT:表示新生代的GC發生的次數和耗時
     FGCT,FGCT:表示老年代Full GC發生的次數和耗時
     GCT:表示總的GC耗時

     2.4 -gccapacity 和-gc相同,同時輸出java堆各區域使用的最大,最小空間;

jstat -gccapacity 2654
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 41984.0 672256.0 239104.0  512.0 4096.0  97792.0    84992.0  1345024.0   162304.0   162304.0      0.0 1355776.0 352640.0      0.0 1048576.0  45696.0 161368  1471

NGCMN、NGCMX:新生代佔用的最小,最大空間

OGCMN、OGCMX:老年代佔用的最大最小空間

OGC、OC:當前代老年代的容量

PGCMN、PGCMX:perm佔用的最小,最大空間

    2.5 -gcutil 和-gc一樣,只是輸出的是已經使用的空間佔總空間的百分比

jstat -gcutil 2654
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
 53.12   0.00  17.48  86.80  59.93  68.68 161376 3205.345  1471 1049.639 4254.984

    2.6 -gccause 垃圾收集統計概述,和-gcutil一樣,增加了最近兩次垃圾回收事件的原因

jstat -gccause 2654
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
 53.12   0.00  27.30  86.80  59.93  68.68 161376 3205.345  1471 1049.639 4254.984 Allocation Failure   No GC

LGCC:最近垃圾回收的原因,GCC:當前垃圾回收的原因

    2.7 -gcnew 統計新生代的行爲

jstat -gcnew 2654
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
1024.0 3584.0  544.0    0.0  1  15 3584.0  76288.0  27588.8 161376 3205.345

TT:Tenuring threshold提升閾值

MTT:最大的tenuring threshold

DSS:survivor區域的大小(KB)

    2.8 -gcnewcapacity 新生代相應內存統計

jstat -gcnewcapacity 2654
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   41984.0   672256.0   415232.0 223744.0   3584.0 223744.0   8192.0   671232.0   289792.0 161464  1472

NGC:當前年輕代的容量KB;

S0CMX,S0C:最大的S0空間和當前S0使用空間

ECMX,EC:最大的Eden空間和當前eden空間

    2.9 -gcold -gcoldcapacity -gcpermcapacity 統計老年代的行爲

    2.10 -printcompilation hotspot編譯方法統計

jstat -printcompilation 2654
Compiled  Size  Type Method
   79318      5    1 java/util/concurrent/CopyOnWriteArrayList getArray

Compiled:被執行的編譯任務數量

Size:方法字節碼的字節數

Type:編譯類型

Method:編譯方法的類名和方法名

3. jmap :用於生成heap dump文件,還可以使用參數配置在OOM時候自動生成dump文件;jmap不僅能生成dump文件,還可以查詢finalize執行隊列,java堆和永久代的詳細信息,如當前使用率,當前使用的是那種收集器等。

命令格式 jmap [option] LVMID
option參數 描述
dump 生成堆轉儲快照
finalizerinfo 顯示在F-Quenue隊列等待Finalizer線程執行finalizer方法的對象
heap

顯示java堆詳細信息

histo 顯示堆哄對象的統計信息
permstat  
F 當-dump沒有響應時,強制生成dump快照

    3.1 -dump -dump:live,format=b,file=dump.hprof 2654

dump堆到文件,format指定輸出格式,live指明是活着的對象,file指定文件存儲

4. jstack 用於生成java虛擬機當前時刻的線程快照,線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成

線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖,死循環,請求外部資源導致的長時間等待,線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後臺做什麼事情,或者等待什麼資源,如果java程序奔潰生成core文件,jstack工具可以用來獲的core文件的java stack 和native stack的信息,如果現在運行的java程序呈現hung的狀態,jstack是非常有用的;

命令格式 jstack [option] LVMID
option參數 含義
-F 當正常輸出請求不被響應時,強制輸出線程堆棧
-l 除堆棧外,顯示關於鎖的附加信息
-m 如果調用到本地方法的話,可以顯示C/C++的堆棧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章