目的
实现动态实时获取程序内部的运行情况
JXM是什么?
笔者理解的JMX应该是JAVA开发者定义的一套用于管理JAVA程序的框架,主流的功能有点类似于Spring,只要有任何遵守这套框架使用标准和行为标准的开发者,都可以往JMX这个框架里面加入自己的内容,从而管理起来。
JMX 核心可以获取程序的几大模块信息,分别是 内存,线程, CPU运行 的运行情况,除此之外,只要遵守标准将代码注册到JMX里面,也可以往JMX注册一些对象。
JMX不仅是获取对象,还是少见的除反射以外可以修改对象内部值的一种方法,更让人匪夷所思的是,一些注册到JMX里面的对象,实际上也是可以远程连接,并实现远程修改。这会给人一种黑客和不安全的感觉。
主要API
//用于获取线程相关信息,如所有线程的活跃状态,活跃时间等
ManagementFactory.getThreadMXBean();
//用于获取内存池相关信息,如redis内存池的大小等等
ManagementFactory.getMemoryPoolMXBeans();
//用于获取加载器相关信息,如加载器的目录,路径等等
ManagementFactory.getClassLoadingMXBean();
//用于获取垃圾回收相关信息,
List<GarbageCollectorMXBean> garbageCollectorMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
主要规律:
基本上JAVA中所有的线程或线程池都可以视为JMX的一个Bean对象,对应的提供获取各类信息Bean 的api。
同时值得注意的是,也可以自己编写一个Bean然后注册进JMX,从而可以远程查看该Bean,从Bean中获取对应的信息
注意:
JMX不仅仅可以获取JAVA中各类信息,本质上其是管理Bean 的一种框架,既然是管理Bean,自然不仅仅是获取查看,也可以远程修改Bean的信息,从而达到远程修改程序内部内容的效果。
实现监控思路
可以编写一个定时任务,任务时间内获取JAVA内部信息,比如想知道线程数量多少,那个线程池活跃的线程比较多,cpu,内存的大小和使用率等,都可以通过日志打印的方式打印对应信息。
甚至可以在此做出假设,通过日志的打印方式可以结合一些日志收集框架实现近实时的监控与预警。