深刻理解Java虛擬機之性能監控與故障處理工具

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

JDK的命令行工具


jps:虛擬機進程情況工具

用法:jps命令格式:jsp [options] [hostid]
jps執行樣例:apache

[root@izbp13zpfq979odk0kub10z ~]# jps -l
3409 tale-least.jar
23702 org.apache.catalina.startup.Bootstrap
26779 sun.tools.jps.Jps
複製代碼

jps工具主要選項:bash


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是一共查詢兩次。eclipse

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


jinfo:Java配置信息工具

用來實時地查看和調整虛擬機各項參數
jinfo命令格式:jinfo [ option ] pid
jinfo執行樣例:工具

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

jinfo工具主要選項:ui


jmap:Java內存映像工具

命令用於生成堆轉儲快照(通常稱爲heapdump或dump文件)
jmap命令格式:jmap [option] vmid
jmap執行樣例:spa

[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在線】,查閱更多精彩歷史!!!

相關文章
相關標籤/搜索