監控和調試功能是應用必備的屬性之一,其手段也是多種多樣。
一般地,我們可以通過:線上日志, zabbix, grafana, cat 等待系統做一問題留底,有問題及時報警,從而達到監控效果。
而對於應用的調試,我之前的文章也提到了幾個工具,當然,我對於 arthas 是調試贊揚的。請參考: 線上應用調試利器 --Arthas
但有句老話: 一千個人眼里有一千個哈姆雷特!所以,你應該要知道更多的方式。
本文來看看咱們另一個調試調試與監控方式!
1. jmx 怎么樣 ?
百科解釋: JMX(Java Management Extensions,即Java管理擴展)是一個為應用程序、設備、系統等植入管理功能的框架。JMX可以跨越一系列異構操作系統平台、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。
簡單來說就是,通過jmx,你可以直接觀察到jmx管理的東西,從而達到實時監控的效果!另外,還可以通過遠程更改jmx的值,從而達到控制管理作用;
要查看監控效果,最簡單的方式,是直接使用 jvisualvm 直接連接到遠程進行觀察,如下:

如果想要更改 jmx 的值,則還是要寫點代碼的,進行反射后就可以更改了!
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從我們手中溜走!
