線上環境中,程序愈來愈慢,一頭霧水?遇到程序常常宕機,但找不到緣由?排查問題卻常常記不住命令? 那是沒找到好的方法而已,本文將介紹一下JVM問題排查工具的使用, 工具僅僅是工具,仍是須要知道一些JVM知識才能夠看懂工具中的參數喲..html
轉帖請註明原貼地址: https://my.oschina.net/u/2342969/blog/2987769java
jdk自帶的可視化排查工具備jconsole和jvisualvm兩個,兩款工具各有千秋,下面簡單說一下博主對兩款工具的選擇spring
注意:它們均位於 ${JAVA_HOME}/bin 下面centos
因爲線上服務器是沒有可視化界面的,使用可視化工具是沒有任何效果的,基本是本地啓動工具,遠程監控服務器的jvm。安全
醬紫就會涉及到如何遠程鏈接jvm,遠程鏈接的方式有兩種,jstatd和jmx。本文將只介紹jmx鏈接方式,由於jstatd鏈接會有權限問題,有一些功能沒法正常使用服務器
如今java應用基本spring boot大一統,下面將介紹一下spring boot應用採用JMX遠程監控JVM的方式。oracle
通常spring boot應用啓動命令以下(線上確定須要配一些jvm參數,這裏再也不贅述):app
java -Xms500m -Xmx1024m -jar /opt/spring-boot-test.jar --Dspring.profiles.active=test --Dserver.port=8181
啓動jmx的啓動方式以下:jvm
java -Xms500m -Xmx1024m -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar /opt/spring-boot-test.jar --Dspring.profiles.active=test --Dserver.port=8181
-Dcom.sun.management.jmxremote.port: jmx遠程端口tcp
-Dcom.sun.management.jmxremote.ssl: 是否開啓ssl認證
-Dcom.sun.management.jmxremote.authenticate:是否開啓ssl認證
本文僅僅簡單演示,如需更多安全配置,請查閱參考文獻
注意:這樣子開啓後,仍然會沒法鏈接
遠程鏈接時會報錯: 沒法使用 service:jmx:rmi:///jndi/rmi://192.168.1.104:3333/jmxrmi 鏈接到 172.16.0.140:3333
報錯緣由是:jmx除了遠程端口外,還監聽了其餘端口,經過命令查看其餘監聽端口
查看應用進程號:
#ps aux|grep spring-boot-test
根據應用進程號,查看監聽端口
#netstat -antup|grep <pid>
如圖能夠看到,除了遠程端口3333外,還監聽了40639和36677兩個端口, 因此須要開放這兩個端口,本文使用的centos 7 默認防火牆使用的firewalld,其餘防火牆自行查閱資料開啓端口
#firewall-cmd --zone=public --add-port=40639/tcp --permanent #firewall-cmd --zone=public --add-port=36677/tcp --permanent #firewall-cmd --zone=public --add-port=3333/tcp --permanent #firewall-cmd --reload
啓動jconsole
#${JAVA_HOME}/bin/jconsole
點擊鏈接,正常鏈接了就會出現下圖,如未正常出現,再詳細對比上面步驟
啓動jvisualvm
#${JAVA_HOME}/bin/jvisualvm
正常啓動就會出現上圖,下面開始進行遠程鏈接
添加JMX遠程鏈接
進入此頁面點擊監控就能夠看到JVM活動狀況,如未出現監控信息,請根據以上步驟依次排查
文獻來自oracle官網java文檔,地址隨時可能變化喲
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/applications_remote.html
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/jmx_connections.html