JVM監控和調優常用命令工具總結

JVM監控和調優常用命令工具總結

        </h1>
        <div class="clear"></div>
        <div class="postBody">

JVM監控和調優

在Java應用和服務出現莫名的卡頓、CPU飆升等問題時總是要分析一下對應進程的JVM狀態以定位問題和解決問題並作出相應的優化,在這過程中Java自帶的一些狀態監控命令和圖形化工具就非常方便了。本文總結了最常用的命令行工具及其常用參數解釋,圖形化監控工具的用法,僅供參考。

jps

Java版的ps命令,查看java進程及其相關的信息,如果你想找到一個java進程的pid,那可以用jps命令替代linux中的ps命令了,簡單而方便。

命令格式:

jps [options] [hostid]

options參數解釋:

  • -l : 輸出主類全名或jar路徑
  • -q : 只輸出LVMID
  • -m : 輸出JVM啓動時傳遞給main()的參數
  • -v : 輸出JVM啓動時顯示指定的JVM參數

最常用示例:

1
2
3
jps -l 輸出jar包路徑,類全名
jps -m 輸出main參數
jps -v 輸出JVM參數

jinfo

jinfo是用來查看JVM參數和動態修改部分JVM參數的命令

命令格式:

jinfo [option] <pid>

options參數解釋:

  • -flag <name> 打印指定名稱的參數
  • -flag [+|-]<name> 打開或關閉參數
  • -flag <name>=<value> 設置參數
  • -flags 打印所有參數
  • -sysprops 打印系統配置
  • <no option> 打印上面兩個選項

最常用示例:

其中11666爲pid

查看JVM參數和系統配置

1
2
3
jinfo 11666
jinfo -flags 11666
jinfo -sysprops 11666

查看打印GC日誌參數

1
2
jinfo -flag PrintGC 11666
jinfo -flag PrintGCDetails 11666

打開GC日誌參數

1
2
jinfo -flag +PrintGC 11666
jinfo -flag +PrintGCDetails 11666

關閉GC日誌參數

1
2
jinfo -flag -PrintGC 11666
jinfo -flag -PrintGCDetails 11666

還可以使用下面的命令查看那些參數可以使用jinfo命令來管理:

1
java -XX:+PrintFlagsFinal -version | grep manageable

常用JVM參數:

-Xms:初始堆大小,默認爲物理內存的1/64(<1GB);默認(MinHeapFreeRatio參數可以調整)空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默認(MaxHeapFreeRatio參數可以調整)空餘堆內存大於70%時,JVM會減少堆直到 -Xms的最小限制
-Xmn:新生代的內存空間大小,注意:此處的大小是(eden+ 2 survivor space)。與jmap -heap中顯示的New gen是不同的。整個堆大小=新生代大小 + 老生代大小 + 永久代大小。
      在保證堆大小不變的情況下,增大新生代後,將會減小老生代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。
-XX:SurvivorRatio:新生代中Eden區域與Survivor區域的容量比值,默認值爲8。兩個Survivor區與一個Eden區的比值爲2:8,一個Survivor區佔整個年輕代的1/10。
-Xss:每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256K。應根據應用的線程所需內存大小進行適當調整。在相同物理內存下,
      減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。一般小的應用, 如果棧不是很深, 應該是128k夠用的,
      大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,
      在論壇中有這樣一句話:"-Xss is translated in a VM flag named ThreadStackSize”一般設置這個值就可以了。
-XX:PermSize:設置永久代(perm gen)初始值。默認值爲物理內存的1/64。
-XX:MaxPermSize:設置持久代最大值。物理內存的1/4。

jstat

jstat命令是使用頻率比較高的命令,主要用來查看JVM運行時的狀態信息,包括內存狀態、垃圾回收等。

命令格式:

jstat [option] LVMID [interval] [count]

其中LVMID是進程id,interval是打印間隔時間(毫秒),count是打印次數(默認一直打印)

option參數解釋:

  • -class class loader的行爲統計
  • -compiler HotSpt JIT編譯器行爲統計
  • -gc 垃圾回收堆的行爲統計
  • -gccapacity 各個垃圾回收代容量(young,old,perm)和他們相應的空間統計
  • -gcutil 垃圾回收統計概述
  • -gccause 垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的原因
  • -gcnew 新生代行爲統計
  • -gcnewcapacity 新生代與其相應的內存空間的統計
  • -gcold 年老代和永生代行爲統計
  • -gcoldcapacity 年老代行爲統計
  • -gcpermcapacity 永生代行爲統計
  • -printcompilation HotSpot編譯方法統計

常用示例及打印字段解釋:

1
jstat -gcutil 11666 1000 3

11666爲pid,每隔1000毫秒打印一次,打印3次

輸出:

S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT

6.17   0.00   6.39  33.72  93.42  90.57    976   57.014    68   53.153  110.168

6.17   0.00   6.39  33.72  93.42  90.57    976   57.014    68   53.153  110.168

6.17   0.00   6.39  33.72  93.42  90.57    976   57.014    68   53.153  110.168

字段解釋:

  • S0 survivor0使用百分比
  • S1 survivor1使用百分比
  • E Eden區使用百分比
  • O 老年代使用百分比
  • M 元數據區使用百分比
  • CCS 壓縮使用百分比
  • YGC 年輕代垃圾回收次數
  • YGCT 年輕代垃圾回收消耗時間
  • FGC 老年代垃圾回收次數
  • FGCT 老年代垃圾回收消耗時間
  • GCT 垃圾回收消耗總時間
1
jstat -gc 11666 1000 3

-gc和-gcutil參數類似,只不過輸出字段不是百分比,而是實際的值。

輸出:

S0C        S1C        S0U  S1U     EC           EU           OC             OU            MC          MU         CCSC      CCSU       YGC  YGCT    FGC   FGCT    GCT

25600.0 25600.0  0.0   1450.0 204800.0 97460.7   512000.0   172668.8  345736.0 322997.7 48812.0 44209.0    977   57.040  68     53.153  110.193

25600.0 25600.0  0.0   1450.0 204800.0 97460.7   512000.0   172668.8  345736.0 322997.7 48812.0 44209.0    977   57.040  68     53.153  110.193

25600.0 25600.0  0.0   1450.0 204800.0 97460.7   512000.0   172668.8  345736.0 322997.7 48812.0 44209.0    977   57.040  68     53.153  110.193

字段解釋:

  • S0C survivor0大小
  • S1C survivor1大小
  • S0U survivor0已使用大小
  • S1U survivor1已使用大小
  • EC Eden區大小
  • EU Eden區已使用大小
  • OC 老年代大小
  • OU 老年代已使用大小
  • MC 方法區大小
  • MU 方法區已使用大小
  • CCSC 壓縮類空間大小
  • CCSU 壓縮類空間已使用大小
  • YGC 年輕代垃圾回收次數
  • YGCT 年輕代垃圾回收消耗時間
  • FGC 老年代垃圾回收次數
  • FGCT 老年代垃圾回收消耗時間
  • GCT 垃圾回收消耗總時間

jstack

jstack是用來查看JVM線程快照的命令,線程快照是當前JVM線程正在執行的方法堆棧集合。使用jstack命令可以定位線程出現長時間卡頓的原因,例如死鎖,死循環等。jstack還可以查看程序崩潰時生成的core文件中的stack信息。

命令格式:

jstack [-l] <pid> (連接運行中的進程)
jstack -F [-m] [-l] <pid> (連接掛起的進程)
jstack [-m] [-l] <executable> <core> (連接core文件)
jstack [-m] [-l] [server_id@]<remote server IP or hostname> (連接遠程debug服務器)

option參數解釋:

  • -F 當使用jstack <pid>無響應時,強制輸出線程堆棧。
  • -m 同時輸出java和本地堆棧(混合模式)
  • -l 額外顯示鎖信息

常用示例:

1
jstack -l 11666 | more

輸出信息:

複製代碼
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode):

Attach Listener #25525 daemon prio=9 os_prio=0 tid=0x00007fd374002000 nid=0x70e8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

複製代碼

具體的輸出解釋比較多,後續會有一篇博客來解釋。現在想要學習的話請參考這篇博客

jmap

jmap是用來生成堆dump文件和查看堆相關的各類信息的命令,例如查看finalize執行隊列,heap的詳細信息和使用情況。

命令格式:

jmap [option] <pid> (連接正在執行的進程)
jmap [option] <executable <core> (連接一個core文件)
jmap [option] [server_id@]<remote server IP or hostname> (鏈接遠程服務器)

option參數解釋:

  • <none> to print same info as Solaris pmap
  • -heap 打印java heap摘要
  • -histo[:live] 打印堆中的java對象統計信息
  • -clstats 打印類加載器統計信息
  • -finalizerinfo 打印在f-queue中等待執行finalizer方法的對象
  • -dump:<dump-options> 生成java堆的dump文件

      dump-options:

      live 只轉儲存活的對象,如果沒有指定則轉儲所有對象

      format=b 二進制格式

      file=<file> 轉儲文件到 <file>

  • -F 強制選項

 常用示例:

1
jmap -dump:live,format=b,file=dump.hprof 11666

輸出:

1
2
Dumping heap to /dump.hprof ...
Heap dump file created

這個命令是要把java堆中的存活對象信息轉儲到dump.hprof文件

1
jmap -finalizerinfo 11666

輸出:

1
2
3
4
5
Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Number of objects pending for finalization: 0

輸出結果的含義爲當前沒有在等待執行finalizer方法的對象

1
jmap -heap 11666

輸出堆的詳細信息

輸出:

複製代碼
Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02

using thread-local object allocation.
Parallel GC with
4 thread(s)

Heap Configuration: //堆內存初始化配置
MinHeapFreeRatio = 0 //對應jvm啓動參數-XX:MinHeapFreeRatio設置JVM堆最小空閒比率(default 40)
MaxHeapFreeRatio = 100 //對應jvm啓動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閒比率(default 70)
MaxHeapSize = 1073741824 (1024.0MB) //對應jvm啓動參數-XX:MaxHeapSize=設置JVM堆的最大大小
NewSize = 22020096 (21.0MB) //對應jvm啓動參數-XX:NewSize=設置JVM堆的新生代的默認大小
MaxNewSize = 357564416 (341.0MB) //對應jvm啓動參數-XX:MaxNewSize=設置JVM堆的新生代的最大大小
OldSize = 45088768 (43.0MB) //對應jvm啓動參數-XX:OldSize=<value>:設置JVM堆的老年代的大小
NewRatio = 2 //對應jvm啓動參數-XX:NewRatio=:新生代和老生代的大小比率
SurvivorRatio = 8 //對應jvm啓動參數-XX:SurvivorRatio=設置新生代中Eden區與Survivor區的大小比值
MetaspaceSize = 21807104 (20.796875MB) // 元數據區大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) //類壓縮空間大小
MaxMetaspaceSize = 17592186044415 MB //元數據區最大大小
G1HeapRegionSize = 0 (0.0MB) //G1垃圾收集器每個Region大小

Heap Usage:
//堆內存使用情況
PS Young Generation
Eden Space:
//Eden區內存分佈
capacity = 17825792 (17.0MB) //Eden區總容量
used = 12704088 (12.115562438964844MB) //Eden區已使用
free = 5121704 (4.884437561035156MB) //Eden區剩餘容量
71.26801434685203% used //Eden區使用比率
From Space: //其中一個Survivor區的內存分佈
capacity = 2097152 (2.0MB)
used
= 1703936 (1.625MB)
free
= 393216 (0.375MB)
81.25% used
To Space:
//另一個Survivor區的內存分佈
capacity = 2097152 (2.0MB)
used
= 0 (0.0MB)
free
= 2097152 (2.0MB)
0.0% used
PS Old Generation
capacity
= 52428800 (50.0MB) //老年代容量
used = 28325712 (27.013504028320312MB) //老年代已使用
free = 24103088 (22.986495971679688MB) //老年代空閒
54.027008056640625% used //老年代使用比率

15884 interned Strings occupying 2075304 bytes.

複製代碼
1
jmap -histo:live 11666 | more

輸出存活對象統計信息

輸出:

複製代碼
num     #instances         #bytes  class name
----------------------------------------------
1:         46608        1111232  java.lang.String
2:          6919         734516  java.lang.Class
3:          4787         536164  java.net.SocksSocketImpl
4:         15935         497100  java.util.concurrent.ConcurrentHashMap$Node
5:         28561         436016  java.lang.Object
複製代碼

jhat

jhat是用來分析jmap生成dump文件的命令,jhat內置了應用服務器,可以通過網頁查看dump文件分析結果,jhat一般是用在離線分析上。

命令格式:

1
jhat [option] [dumpfile]

option參數解釋:

  • -stack false: 關閉對象分配調用堆棧的跟蹤
  • -refs false: 關閉對象引用的跟蹤
  • -port <port>: HTTP服務器端口,默認是7000
  • -debug <int>: debug級別

   0: 無debug輸出

 

   1: Debug hprof file parsing

 

   2: Debug hprof file parsing, no server

 

  • -version 分析報告版本

常用示例:

1
jhat dump.hprof

jconsole, jvisualvm

除了以上所述的常用命令行工具之外還有圖形化工具,使用上比較簡單。在命令行下執行jconsole和jvisualvm即可。具體的用法,自己去點一點就瞭解了。

jconsole:

 

 

jvisualvm:

 

 

 

 

 

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