监控和调试功能是应用必备的属性之一,其手段也是多种多样。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从咱们手中溜走!