-
Notifications
You must be signed in to change notification settings - Fork 3
Home
简单的来说,这是一个很有意思的工具,用于放在我们的java项目中,实时查看系统的运行情况,方便我们实时进行一些调试和配置修改,同时检查死锁。
可能很多高手早就知道了jmx是什么,jconsole是什么,不需要我一一解释,但这个项目存在的意义之一就是让新手也能参与,让新手们有个可实际动手的例子,更快的掌握java的编程技术。所以,我先从基础说起。
本项目的目的是用尽量简单的方式做一个常用的工具出来,为java的初学者们提供一个学习和实践的机会。
运行com.ynitq.utils.jmxInWeb.TestJmxHttpServer
, 然后在浏览器中打开 http://localhost:8080/
很多java的初学者一开始就直接用Spring 、Struts等等框架,并不了解为什么要用这些框架,所以我们尽量用一些原始的手段来实现MVC的框架,让初学者们了解Web项目中MVC的原理。
-
非常官方的说法:
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
-
简单的说法:
当年设计java语言的高手们设计了一个接口,让我们可以通过各种工具通过这个接口访问java虚拟机的内部的各种参数,我们也可以自己写一个遵循这个接口类,反映一下我们的程序的各个状态,然后我们可以工具软件就可以知道我们的程序运行时的各类状态。
可能这个时候立刻就有人说:我们如果想知道程序的状态,我们可以用打log啊,我们可以通过web界面展示啊,我们为什么要折腾这个叫JMX的东西呢。答案就是:我们懒,写log不能实时反映状态,写web界面太麻烦了,最好就是我们就简单的写个类,某某工具就该自动能生成界面并调用这个类的方法,于是,JMX这个东西就出现了。
** 想偷懒,是推动一切软件科技发展的原动力 **
-
我们有什么工具可访问JMX?
设计java的高手们早就为我们在jdk中准备了一个工具jconsole了,只要我们转了jdk,jconsole.exe就存在了。我们直接在命令行下敲jconsole就行了,多简单啊。
-
遵循Jmx接口规范的类叫MBean,这些MBean只要注册到MBeanServer后,我们就可以在外面通过工具实时操作这些类的方法了。
-
自己写MBean是个非常麻烦的事情,就不是一般般的麻烦,这东西明显有违 我们要偷懒 的原则。幸好,幸好!我们有Spring!Spring将原来一个很复杂的过程变成了一个三言两语就可以搞定的事情。long live Spring Framework!
-
虚拟机中有很多个MBeanServer,我们可以通过 java.lang.management.ManagementFactory 这个类 获取系统内置的MBeanServer,也可以创建自己的MBeanServer,例如:
//我们自己创建一个
MBeanServer myServer = MBeanServerFactory.createMBeanServer("JmxInWeb");
//我们获取记录了系统各类信息的MBeanServer
MBeanServer platformServer = ManagementFactory.getPlatformMBeanServer();
好吧,这个时候就让大家认识一下jconsole这个精彩的工具了,首先,我们随便启动一个java的程序,例如 eclipse,tomcat什么的,这些在大家的机器上十有八九都安装好了。
-
然后,我们在开命令行敲jconsole,我们就该看到如下的画面:
瞧,启动了,很明显,我们发现可以连接本地运行中的java程序,也可以连接远程服务器上的程序。连接本地就简单了,点击就好,但如果连接远程的呢?这个稍后再说,因为很麻烦,这个麻烦本来就是我们做本项目的原因。
-
随便选择一个本地java进程后,我们将看到这样的画面:
瞧,多精彩,我们看到了这个java程序当前的各类参数,内存使用、线程数等等。这工具调用了相关的MBean,并将结果以很友好的界面展现出来。
-
如果我点击标签栏中的“VM摘要”,我们还可以看到虚拟机、操作系统、硬件的信息
-
要看更加的精彩的部分,请点击标签栏的“线程”:
jconsole不但调用了线程相关MBean,让我们看到每个线程当前运行到哪了,最难得的是居然有按钮可以实时检测死锁相关的MBean,这个功能对于高并发的项目实在是太重要的,死锁是没有办法通过测试用例检测出来的,只有运行时才会发生,如果没有这个工具,我们将难以定位发生死锁的地方。
-
首先 jconsole连接的是 ManagementFactory.getPlatformMBeanServer() 获得的MBeanServer,连的不是我们自己创建的。
-
连接远程服务器时,那个连接非常麻烦,如果远程服务器上的防火墙开发了所有端口,我们可以用标准的url访问,例如:
service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
但现实中,因为安全问题,我们只会用ssh隧道的方法访问,于是就出现超复杂的url,例如:
service:jmx:rmi://localhost:11097/jndi/rmi://localhost:11099/jmxrmi
-
即使我们通过修改远程服务的url,连上我们自己的MBeanServer,那个操作界面简直就是惨不忍睹。
- 请遵循google的代码规范
- 请有良好的写测试用例的习惯,代码中有测试用例给各位参考
- 能否不要搞什么连接,直接嵌入原来的java项目中,多省事。
- web界面多好! Ajax多好!平板也能访问多好!
- 界面能否好看点,看看人家Bootstrap嘛。
所以,这个项目就产生了