工欲善其事必先利其器,jdk自帶了不少工具,利用好這些工具可以幫咱們獲取想要的數據(運行日誌、異常堆棧、GC日誌、線程快照、堆轉儲快照等),從而快速的分析數據、定位問題。html
jps命令不光名字像Linux中的ps命令,功能也很相似,能夠直接找到Java進程的ID(以前一直用的 ps aux | grep "關鍵字" 來查或許該改改了)
jps命令格式:
jps [options] [hostid]
樣例:java
root@ship:/home/apps# jps -v -l
6485 sun.tools.jps.Jps -Dapplication.home=/usr/local/jdk1.8.0_161 -Xms8m
6297 alipay-demo-1.0.jar -Xms20M -Xmx40M
-l 能夠輸出主類的全名,若是進程執行的是Jar包則輸出Jar包路徑
-v 輸出啓動時JVM參數spring
jstat是用於監視虛擬機各類運行狀態信息的命令行工具,它能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。
jstat命令格式:
jstat [option vmid [interval [s|ms] [count] ] ]
樣例:
jstat -gc 6297 250 20
這表示每250毫秒查詢一次進程6297的垃圾收集狀況,一共查詢20次。
其餘命令不作過多介紹。springboot
jinfo的做用是實時的查看和調整虛擬機的各項參數,雖然jsp -v命令也能夠看到JVM參數可是未被指定的默認參數沒法查看。
jinfo命令格式:
jinfo [option] pid
樣例:
jinfo -sysprops 6297 會把虛擬機進程System.getProperties()的內存打印出來。
jinfo 6297 不指定選項會打印全部的內容bash
jmap命令用於生成堆轉儲快照(dump文件),除了這種方式仍是能夠在啓動時添加 -XX:+HeapDumpOnOutOfMemoryError參數,讓虛擬機出現OOM異常時自動生成dump文件。
除了獲取dump文件,該命令還能夠查詢finalize執行隊列、Java堆和永久代的詳細信息等。
jmap命令格式:
jmap [option] vmid
樣例:服務器
root@ship:/home/apps# jmap -dump:live,format=b,file=alipay.bin 12507
Dumping heap to /home/apps/alipay.bin ...
Heap dump file created
jmap -heap 12507 顯示Java堆的詳細信息app
jhat能夠用來分析jmap生成的堆轉儲快照,分析完成後能夠在遊覽器中查看,不過這個功能比較雞肋,有好幾個更專業更強大的工具,好比Eclipse Memory Analyzer、IBM HeapAnalyzer等。
使用方法:
而後在遊覽器輸入http://ip:7000/就能夠看到分析結果,如圖。
jsp
jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條進程正在執行的方法堆棧的集合,生成線程快照的主要是目的是定位線程出現長時間停頓的緣由,好比線程死鎖、死循環、請求外部資源長時間得不到響應等。以前遇到CPU使用率太高的問題,就使用了這個命令排查的,參考博客http://www.javashuo.com/article/p-wyujgvlx-gq.html
jstack命令格式:
jstack [option] vmid
樣例:
每一個線程都有這個選項Locked ownable synchronizers,這是個什麼呢?官方定義以下工具
一個可持有的同步器多半是線程獨有而且使用了AbstractOwnableSynchronizer(或是其子類)去實現它的同步特性,ReentrantLock與ReentrantReadWriteLock就是JAVA平臺提供的兩個例子。ui
真的要好好研究下死鎖時它的堆棧信息了。
JConsole是一個功能強大的可視化工具,能夠監控本地和遠程服務器虛擬機。
雙擊JDK/bin目錄的jconsole.exe便可啓動,如圖。
鏈接本地虛擬機比較簡單,直接選就能夠了,下面先說怎麼鏈接遠程虛擬機?
實現對springboot jar包的遠程監控方法:
1.添加啓動參數
nohup java
-Djava.rmi.server.hostname=198.13.40.234
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-jar alipay-demo-1.0.jar >/dev/null 2>&1 &
2.若是以爲這樣太麻煩,也能夠定義系統環境變量來表示,在/etc/profile文件添加以下內容。
export JAVA_OPTS="-Djava.rmi.server.hostname=198.13.40.234 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
而後使用命令source /etc/profile刷新配置
最後運行這個腳本啓動nohup java $JAVA_OPTS -jar alipay-demo-1.0.jar >/dev/null 2>&1 &
3.輸入地址,用戶名,密碼等信息便可登錄。
jvisualvm的鏈接方法也相似。
VisualVM是目前爲止功能最強大的運行監視和故障處理程序。
VisualVM具有插件擴展功能,經過插件擴展能夠作到: