在Java應用和服務出現莫名的卡頓、CPU飆升等問題時老是要分析一下對應進程的JVM狀態以定位問題和解決問題並做出相應的優化,在這過程當中Java自帶的一些狀態監控命令和圖形化工具就很是方便了。本文總結了最經常使用的命令行工具及其經常使用參數解釋,圖形化監控工具的用法,僅供參考。java
Java版的ps命令,查看java進程及其相關的信息,若是你想找到一個java進程的pid,那能夠用jps命令替代linux中的ps命令了,簡單而方便。linux
命令格式:bash
jps [options] [hostid]
服務器
options參數解釋:jvm
最經常使用示例:工具
jps -l 輸出jar包路徑,類全名 jps -m 輸出main參數 jps -v 輸出JVM參數
jinfo是用來查看JVM參數和動態修改部分JVM參數的命令性能
命令格式:學習
jinfo [option] <pid>測試
options參數解釋:優化
最經常使用示例:
其中11666爲pid
查看JVM參數和系統配置
jinfo 11666 jinfo -flags 11666 jinfo -sysprops 11666
查看打印GC日誌參數
jinfo -flag PrintGC 11666 jinfo -flag PrintGCDetails 11666
打開GC日誌參數
jinfo -flag +PrintGC 11666 jinfo -flag +PrintGCDetails 11666
關閉GC日誌參數
jinfo -flag -PrintGC 11666 jinfo -flag -PrintGCDetails 11666
還可使用下面的命令查看那些參數可使用jinfo命令來管理:
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命令是使用頻率比較高的命令,主要用來查看JVM運行時的狀態信息,包括內存狀態、垃圾回收等。
命令格式:
jstat [option] LVMID [interval] [count]
其中LVMID是進程id,interval是打印間隔時間(毫秒),count是打印次數(默認一直打印)
option參數解釋:
經常使用示例及打印字段解釋:
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
字段解釋:
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
字段解釋:
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參數解釋:
經常使用示例:
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是用來生成堆dump文件和查看堆相關的各種信息的命令,例如查看finalize執行隊列,heap的詳細信息和使用狀況。
命令格式:
jmap [option] <pid> (鏈接正在執行的進程)
jmap [option] <executable <core> (鏈接一個core文件)
jmap [option] [server_id@]<remote server IP or hostname> (連接遠程服務器)
option參數解釋:
dump-options:
live 只轉儲存活的對象,若是沒有指定則轉儲全部對象
format=b 二進制格式
file=<file> 轉儲文件到 <file>
經常使用示例:
jmap -dump:live,format=b,file=dump.hprof 11666
輸出:
Dumping heap to /dump.hprof ... Heap dump file created
這個命令是要把java堆中的存活對象信息轉儲到dump.hprof文件
jmap -finalizerinfo 11666
輸出:
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方法的對象
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.
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是用來分析jmap生成dump文件的命令,jhat內置了應用服務器,能夠經過網頁查看dump文件分析結果,jhat通常是用在離線分析上。
命令格式:
jhat [option] [dumpfile]
option參數解釋:
0: 無debug輸出
1: Debug hprof file parsing
2: Debug hprof file parsing, no server
經常使用示例:
jhat dump.hprof
除了以上所述的經常使用命令行工具以外還有圖形化工具,使用上比較簡單。在命令行下執行jconsole和jvisualvm便可。具體的用法,本身去點一點就瞭解了。
jconsole:
jvisualvm: