前面幾篇講了關於JVM的理論知識,今天介紹幾個JDK的命令行工具,來快速定位線上問題。java
用法: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 [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
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命令格式:jinfo [ option ] pid
jinfo執行樣例:工具
[root@izbp13zpfq979odk0kub10z ~]# jinfo -flag MaxHeapSize 3409
-XX:MaxHeapSize=134217728
複製代碼
jinfo工具主要選項:ui
命令用於生成堆轉儲快照(通常稱爲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(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(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在線】,查閱更多精彩歷史!!!