跟我学系列之JVM远程监控编写(一)

从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了许多MXBean的接口类,可以很方便的获取到JVM的内存、GC、线程、锁、class、甚至操作系统层面的各种信息,本文就简单的介绍一种利用JMX对JAVA进程进行CPU、堆内存使用的监控。很多朋友都在说,其实真没必要,现在有很多的工具都可以监控,比如:JMap,JHat,MAT,VIsualVM,JConsole工具都可以,但是有些时候Jconsole不一定能监控到作为系统服务的java进程,在这里我给大家做一个入门介绍。

JMX(Java Management Extensions),即JAVA管理扩展,用来监视和管理JVM以及其运行的操作系统。目前java平台主要提供了下图所示的9个MXBean, 各个MXBean的作用根据类名大概能猜出几分,具体可查API。

ClassLoadingMXBean
MemoryMXBean
ThreadMXBean
CompilationMXBean
GarbageCollectorMXBeans
MemoryPoolMXBeans
OperatingSystemMXBean
RuntimeMXBean
MemoryManagerMXBeans

java.lang.management包中的mxbean提供了基本的功能,在sum.com.management中对某些功能有所增强,当然我们也可以根据JMX规范提供自己的MXBean。

在正式编码之前,我们必须要得到JMXConnector并创建MBeanServerConnnection,有了这个connection我们就可以利用ManagementFactory创建需要的MXBean了,类依赖图如下:

代码如下:

然后,采集memory的数据就比较简单了,直接调用API获取:

采集CPU利用率需要自己计算一下,因为API只提供了获取cpu的使用时间,我得在两次系统时间间隔内获取两次CPU的使用时间,得到在该时间间隔内cpu使用的时间,相除即得到CPU的使用率,当然误差肯定存在。

如果想收集本地的JVM信息也可以这样写:

上一篇:NIO DirectByteBuffer 内存泄露的测试


下一篇:深入讨论阻塞与非阻塞、同步与异步的区别