虚拟机的性能监控与故障处理——jps,jstat,jinfo,jmap,jhat,jstack
Java虛擬機實現了內存自動分配,垃圾回收機制,但是這一過程,究竟什么時候執行,執行到什么地步,卻需要jdk提供的一些工具來監控。
比如jps,jstat,jinfo,jmap,jhat,jstack。
1,jps
首先看看jps,jps——java process status tool,也就是java進程狀態工具,奧~,原來是看現在運行的java進程的狀態的,jps也有點像linux的ps命令,那么如何使用呢?
jps? [option]
看例子吧
jps -m 這個命令就是查看機器上虛擬機進程啟動時傳遞給main方法的參數。
jps -q 輸出LVMID 省略主類。輸出的就是pid
jps -l 輸出主類的全名,如果是jar包,則輸出jar路徑。 ?
jps -v 這個是輸出虛擬機進程啟動時jvm的參數。
2,jstat
jstat,? java statistics monitoring tool? 狀態監視工具,可以顯示虛擬機進程中的類加載,內存,垃圾回收,JIT即時編譯等的運行數據。純文本的展示。如何使用呢?
jstat [option] [pid/host_id] [interval (ms)] [count]
直接看例子,比如我們查到一個java進程的pid是7689,那么使用起來就是這樣:
jstat -gc 7689 250 20? 這句話就是查詢這個進程的垃圾回收情況,每隔250ms查看一次,總共查詢20次。
當然也可以不輸入后面兩個參數,這樣就只統計一次。
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 4544.0 4544.0 0.0 41.5 36864.0 17882.8 91472.0 70365.5 87424.0 84851.3 10112.0 9586.1 791 5.742 4 0.723 6.465這是統計GC時的參數
S0C 是S0區域的capacity總容量,S1C是S1區域的capacity,S0U的U是used,已使用容量S0C:第一個幸存區的大小
- S1C:第二個幸存區的大小
- S0U:第一個幸存區的使用大小
- S1U:第二個幸存區的使用大小
- EC:伊甸園區的大小
- EU:伊甸園區的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法區大小
- MU:方法區使用大小
- CCSC:壓縮類空間大小
- CCSU:壓縮類空間使用大小
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收消耗時間
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
option選項主要有下面這些
-class?? 監視類加載,卸載,總空間以及類裝載耗費的時間
-gc????? 監視java堆情況,包括Eden區,兩個survivor,老年代,永久代容量,已用空間,gc時間合計。
-gccapacity?? 類似-gc,主要關注java堆各個區域的最大和最小空間
-gcutil????? 類似-gc,但是主要輸出已使用空間所占的百分比
-gccause?? 類似-gc,額外輸出上一次gc的原因。
-gcnew??? 監視新生代
-gcnewcapacity? 類似-gcnew,但主要關注新生代使用到的的最大和最小空間
-gcold???? 監視老年代
-gcoldcapacity? 類似-gcold,但是主要關注老年代使用到的的最大和最小空間
-gcpermcapacity? 輸出永久代使用到的最大和最小空間
-compiler??? 輸出JIT編譯過得方法,耗時等信息
-printcompilation???? 輸出已經被JIT編譯過得方法。
3,jinfo ?配置信息工具
-flag <name> ? ? ? ? to print the value of the named VM flag 打印虛擬機參數
? ? -flag [+|-]<name> ? ?to enable or disable the named VM flag ?
? ? -flag <name>=<value> to set the named VM flag to the given value 設置jvm參數,注意堆棧大小不能變,不能設置
? ? -flags ? ? ? ? ? ? ? to print VM flags ? 打印所有jvm參數
? ? -sysprops ? ? ? ? ? ?to print Java system properties ?打印此次啟動java的所有系統參數
? ? <no option> ? ? ? ? ?to print both of the above ?不加option打印所有
? ? -h | -help ? ? ? ? ? to print this help message
使用舉例 jinfo -flags 20698 ?打印這個pid的所有jvm參數
4,jmap ?jhat jstack用到的時候再寫
4. jstack?
使用方式:
jstack -l pid >1.txt? 導出到文件
jstack pid? ?直接展示
可以打印出來線程的堆棧信息。
"Log4j2-Log4j2Scheduled-2" #17 daemon prio=5 os_prio=0 tid=0x000000001eaba000 nid=0x4c34 waiting on condition [0x0000000022c4e000]java.lang.Thread.State: TIMED_WAITING (parking) //線程現在的狀態at sun.misc.Unsafe.park(Native Method) //正執行到的方法- parking to wait for <0x00000006c1a16188> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)對死鎖問題可以直接展示,形如:
Found one Java-level deadlock: ============================= "Thread-1":waiting to lock monitor 0x000000001ca50e48 (object 0x000000076b758920, a java.lang.Object),which is held by "Thread-0" "Thread-0":waiting to lock monitor 0x000000001ca53628 (object 0x000000076b758930, a java.lang.Object),which is held by "Thread-1"5,jmap?
主要的可以導出hprof文件:
jmap -dump:file=hprof-jvm.bin -F? pid? 直接導出。
導出的文件可以使用eclipse的mat來進行分析
總結
以上是生活随笔為你收集整理的虚拟机的性能监控与故障处理——jps,jstat,jinfo,jmap,jhat,jstack的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HandlerInterceptor和H
- 下一篇: Spring运行期间配置文件解析返回