深入理解Java虛擬機器之效能監控與故障處理工具

JAVA線上發表於2019-01-24

前面幾篇講了關於JVM的理論知識,今天介紹幾個JDK的命令列工具,來快速定位線上問題。

JDK的命令列工具

深入理解Java虛擬機器之效能監控與故障處理工具

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工具主要選項:

深入理解Java虛擬機器之效能監控與故障處理工具

jstat:虛擬機器統計資訊監視工具

jstat命令格式:jstat [option vmid [ interval[s|ms] [count] ] ]
jstat執行樣例:

[root@izbp13zpfq979odk0kub10z ~]# jstat -gc 3409 5s 2
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
4352.0 4352.0  0.0   208.6  34944.0  26126.4   87424.0    28452.7   28160.0 26891.3 3072.0 2755.0   3583    9.813   1      0.035    9.848
4352.0 4352.0  0.0   208.6  34944.0  26126.4   87424.0    28452.7   28160.0 26891.3 3072.0 2755.0   3583    9.813   1      0.035    9.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主要工具選項:

深入理解Java虛擬機器之效能監控與故障處理工具

jinfo:Java配置資訊工具

用來實時地檢視和調整虛擬機器各項引數
jinfo命令格式:jinfo [ option ] pid
jinfo執行樣例:

[root@izbp13zpfq979odk0kub10z ~]# jinfo -flag MaxHeapSize 3409
-XX:MaxHeapSize=134217728
複製程式碼

jinfo工具主要選項:

深入理解Java虛擬機器之效能監控與故障處理工具

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主要工具選項:

深入理解Java虛擬機器之效能監控與故障處理工具

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虛擬機器之效能監控與故障處理工具

如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【Java線上】,查閱更多精彩歷史!!!


相關文章