監控和調試功能是應用必備的屬性之一,其手段也是多種多樣。html
通常地,咱們能夠經過:線上日誌, zabbix, grafana, cat 等待系統作一問題留底,有問題及時報警,從而達到監控效果。網絡
而對於應用的調試,我以前的文章也提到了幾個工具,固然,我對於 arthas 是調試讚賞的。請參考: 線上應用調試利器 --Arthas框架
但有句老話: 一千我的眼裏有一千個哈姆雷特!因此,你應該要知道更多的方式。jvm
本文來看看我們另外一個調試調試與監控方式!socket
1. jmx 怎麼樣 ?ide
百科解釋: JMX(Java Management Extensions,即Java管理擴展)是一個爲應用程序、設備、系統等植入管理功能的框架。JMX能夠跨越一系列異構操做系統平臺、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。工具
簡單來講就是,經過jmx,你能夠直接觀察到jmx管理的東西,從而達到實時監控的效果!另外,還能夠經過遠程更改jmx的值,從而達到控制管理做用;post
要查看監控效果,最簡單的方式,是直接使用 jvisualvm 直接鏈接到遠程進行觀察,以下:網絡傳輸協議
若是想要更改 jmx 的值,則仍是要寫點代碼的,進行反射後就能夠更改了!url
2. jmx 如何開啓?
若是你對如上的結果還比較滿意,那麼,你應該考慮下怎麼開啓jmx了!
其實很簡單,通常藉助框架進行操做,而應用自身則配置一個 jmx 端口就好了!
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8573
這樣開啓後,就能夠本地鏈接進行查看了。固然了,如上操做是危險的,請慎重!
另外,咱們通常能夠多安裝兩個插件,Mbean 和 Thread Inspector 以便在出現問題時及時查看線程信息!
jmx的輸出信息,除了給咱們實時監控用外,還能夠藉助一些第三方工具如grafana進行收集後進行持久化。可視化顯示出現!(須藉助 jmx_exportor, Prometheus 等工具)
jmx 還能夠作什麼?
對於線上應用的jvm調優,多半也是能夠基於 jmx 作的~
3. remote debug 如何?
remote debug , 看起來有點高大上。至少我本身想來,這種實現方式應該是複雜的!
我的以爲有兩個難點:
1. 如何鏈接到遠程進程中debug,關鍵是遠程是以 run 的形式進行的?
2. 遠程的代碼如何與本地對應?
咱們在開發階段,爲何很容易解決問題?其實,不少時候就是由於能夠debug,能夠直接跟蹤到問題的根源。因此,你懂的,能debug就等於給了你無限的力量!
斷點幾乎能解決全部的問題。
可是,對於線上應用,你的斷點則意味着應用失去響應,多是事故級操做。因此,仍是悠着點~
4. remote debug 如何開啓?
一樣,若是你以爲這對你還有點用,天然想看下如何開啓了。兩個步驟!
1. 遠程開啓調試功能!
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8739
2. ide 開戶遠程 debug!
就ok 了!
接下來,就是debug時間,支持任意斷點,包括啓動時的斷點;
另外,對於臨時的代碼改動,能夠進行即時生效!
須要注意的是,在遠程debug時,控制檯的輸出將是向遠程輸出,而非向本地輸出!
老話:不要讓一個bug從咱們手中溜走!