深入理解Java虛擬機器之效能監控與故障處理工具
前面幾篇講了關於JVM的理論知識,今天介紹幾個JDK的命令列工具,來快速定位線上問題。
JDK的命令列工具
jps:虛擬機器程序狀況工具
用法:jps命令格式:jsp [options] [hostid]
jps執行樣例:
[root@izbp13zpfq979odk0kub10z ~]# jps -l 3409 tale-least.jar 23702 org.apache.catalina.startup.Bootstrap 26779 sun.tools.jps.Jps 複製程式碼
jps工具主要選項:
jstat:虛擬機器統計資訊監視工具
jstat命令格式:jstat [option vmid [ interval[s|ms] [count] ] ]
jstat執行樣例:
[root@izbp13zpfq979odk0kub10z ~]# jstat -gc 3409 5s 2 S0CS1CS0US1UECEUOCOUMCMUCCSCCCSUYGCYGCTFGCFGCTGCT 4352.0 4352.00.0208.634944.026126.487424.028452.728160.0 26891.3 3072.0 2755.035839.81310.0359.848 4352.0 4352.00.0208.634944.026126.487424.028452.728160.0 26891.3 3072.0 2755.035839.81310.0359.848 複製程式碼
執行樣例中3409是程序ID,5s是每隔五秒查詢一次,2是一共查詢兩次。
- S0C: Young Generation第一個survivor space的記憶體大小 (kB).
- S1C: Young Generation第二個survivor space的記憶體大小 (kB).
- S0U: Young Generation第一個Survivor space當前已使用的記憶體大小 (kB).
- S1U: Young Generation第二個Survivor space當前已經使用的記憶體大小 (kB).
- EC: Young Generation中eden space的記憶體大小 (kB).
- EU: Young Generation中Eden space當前已使用的記憶體大小 (kB).
- OC: Old Generation的記憶體大小 (kB).
- OU: Old Generation當前已使用的記憶體大小 (kB).
- PC: Permanent Generation的記憶體大小 (kB)
- PU: Permanent Generation當前已使用的記憶體大小 (kB).
- YGC: 從啟動到取樣時Young Generation GC的次數
- YGCT: 從啟動到取樣時Young Generation GC所用的時間 (s).
- FGC: 從啟動到取樣時Old Generation GC的次數.
- FGCT: 從啟動到取樣時Old Generation GC所用的時間 (s).
- GCT: 從啟動到取樣時GC所用的總時間 (s).
可以使用ps -p pid -o etime
檢視下程序的執行時間:
[root@izbp13zpfq979odk0kub10z ~]# ps -p 3409 -o etime ELAPSED 104-04:30:20 複製程式碼
哈哈,104天才執行一次YGC與FGC才這麼點。如果YGC過於頻繁說明eden不夠了,可以考慮加機器。正常來說FGC應該佔整個GC(YGC+FGC)的1%到5%才正常,如果FGC過於頻繁,可以考慮增大MaxPermSize的值。
jstat主要工具選項:
[root@izbp13zpfq979odk0kub10z ~]# jinfo -flag MaxHeapSize 3409 -XX:MaxHeapSize=134217728 複製程式碼
jinfo工具主要選項:
jmap:Java記憶體映像工具
命令用於生成堆轉儲快照(一般稱為heapdump或dump檔案)
jmap命令格式:jmap [option] vmid
jmap執行樣例:
[root@izbp13zpfq979odk0kub10z ~]# jmap -dump:live,format=b,file=blog.log 3409 Dumping heap to /root/blog.log ... Heap dump file created 複製程式碼
jmap主要工具選項:
jhat:虛擬機器堆轉儲快照分析工具
jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。一般不會直接使用jhat命令來分析dump檔案,主要原因有二:一是一般不會在部署應用程式的伺服器上直接分析dump檔案;另外一個原因是jhat的分析功能相對來說比較簡陋。
jhat執行樣例:
[root@izbp13zpfq979odk0kub10z ~]# jhat blog.log Reading from blog.log... Dump file created Tue Sep 11 22:52:53 CST 2018 Snapshot read, resolving... Resolving 281153 objects... Chasing references, expect 56 dots........................................................ Eliminating duplicate references........................................................ Snapshot resolved. 複製程式碼
jstack:Java堆疊跟蹤工具
jstack(Stack Trace for Java)命令用於生產虛擬機器當前時刻的執行緒快照(一般稱為threaddump或者javacore檔案)。執行緒快照就是當虛擬機器內每一條執行緒正在執行的方法堆疊集合,生產執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致長時間等待等都是導致執行緒長時間停頓的常見原因。執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做些什麼事情,或者等待著什麼資源。
jstack命令格式:jstack [option] vmid
jstack執行樣例:
[root@izbp13zpfq979odk0kub10z ~]# jstack -l 3409 2018-09-11 22:57:24 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode): "blade-pool-252" #252 prio=5 os_prio=0 tid=0x00007fcbf00bb000 nid=0x4845 waiting on condition [0x00007fcbd2fee000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for<0x00000000fb242608> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392) at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564) at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None 複製程式碼
jstack主要工具選項:
如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【Java線上】,查閱更多精彩歷史!!!