java中jmx/jconsole/jstat/jmap的关系
JMX是java5开始提供的对java应用进行监控的一套接口。实现方式是在jvm内部起一个mbeanserver通过网络对外开放调用接口,这样外部就可以做应用监控或者类似远程方法调用。java默认实现了jvm的一些监控,比如堆内存使用情况(MemoryMXBean),线程情况(ThreadMXBean),gc情况等,外部程序可以直接使用,比如jconsole实际上就是对这些bean的包装,只是把返回结果可视化了。我们也可以针对自己的应用写一写MBean出来,然后开放给外部,这样可以做自己的应用监控,或者作为远程调用,比如加载配置文件,修改参数等。
在java5中,jvm启动时需要在命令行指定jmx才会启动,而java6默认就会启动jmx了。java6中jconsole可以通过pid进行jmx管理,内部有个把pid转化为jmx url的过程。
我们平时还会用到jstat,jmap等监控工具,这两个不是通过jmx调用实现的,而是直接在虚拟机原生支持的。比如jmap支持-F选项,在jvm不响应的时候还可以dump出内存来。
通过pid链接jmx:http://www.pongasoft.com/blog/yan/entry/connecting_to_a_local_vm/
http://stackoverflow.com/questions/5552960/how-to-connect-to-a-java-program-on-localhost-jvm-using-jmx
jmap的实现分析:http://blog.csdn.net/raintungli/article/details/7023092
java6中性能分析诊断工具:http://www.ibm.com/developerworks/java/library/j-java6perfmon/