从JMX 谈系统监控

borislee0 2012-03-19

参考:http://www.mengxiansheng.net/index.php/archives/66

jmx介绍:

http://en.wikipedia.org/wiki/Java_Management_Extensions 写道写道

Java Management Extensions (JMX) is a Java technology that supplies tools for managing and monitoring applications, system objects, devices (e. g. printers) and service oriented networks. Those resources are represented by objects called MBeans (for Managed Bean). In the API, classes can be dynamically loaded and instantiated. Managing and monitoring applications can be designed and developed by Java Dynamic Management Kit.JMX 1.0, 1.1 and 1.2 were defined by JSR 003[1] of the Java Community Process. As of 2006, JMX 2.0 is being developed under JSR 255.[2] The JMX Remote API 1.0 for remote management and monitoring is specified by JSR 160.[3] An extension of the JMX Remote API for Web Services is being developed under JSR 262.[4]

系统/应用/网站监控:

在开源的时代,只要你有足够的学习能力,完成一个系统/网站几乎不会存在技术难题,但对于系统的性能监控,重要功能性能指标的监控,数据库并发数量的监控等等问题同时也需要我们去实现。这时JMX就必须被提及了,开源架构配合JMX可以很容易的完成系统的监控功能。

更多jmx资源:

http://en.wikipedia.org/wiki/Java_Management_Extensions

http://www.oracle.com/technetwork/articles/javase/jmx-138825.html#1

体验JMX的强大之处:

      童鞋们是否使用过weblogic、websphere 、oracle as这样的商用服务器,如果使用过你一定对它的管理控制台的能力印象深刻,我们可以通过他们的管理控制台去监控JVM 堆栈的使用情况,可以执行JVM 垃圾回收,可以配置数据库连接池的参数且不用重启服务就可以生效,试想它们是如何实现这样强大的功能的?

jmx,使用jmx可以很轻易的去监控系统中重要线程的运行情况,如数据缓冲池、自定义对象缓冲池的使用等等,并且可以去监控JVM虚拟机的运行情况,且可以远程调用jvm的垃圾回收。

jmx实战:

现在主流的SSH框架已经深入人心,使用spring可以让jmx变的更加容易,将jmx融入我们的系统中可以让系统更加强健,更加具有可维护性,当系统发生故障时我们可以通过jmx远程查看主要功能的运行状况,以对系统故障做出客观的判断,这对后期维护很重要,下面的案例以spring+jmx 将项目运行在jetty上 为例(因为spring对jmx做了很好的整合,可以减少很多工作)。

1.spring 配置文件

<!--通过jmx实现对城市新闻实体对象缓冲池的监控、参数调整的功能,export 是将制定的bean暴漏给jmx,使其可以通过远程jconsole可以进行控制-->
	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
		lazy-init="false">
		<property name="beans">
			<map>
				<entry key="bean:name=cityNewsPoolMbean" value-ref="cityNewsPoolMbean" />			
 			</map>
		</property>
	</bean>
	<!--可以让jconsole进行远程查看参数,修改参数bean对象,JikePoolMbean 是一个普通事java bean,里面是get**、set**方法-->
	<bean id="cityNewsPoolMbean" class="com.jike.mobile.JikePoolMbean">
		<constructor-arg index="0"
			type="org.apache.commons.pool.impl.GenericObjectPool" ref="cityNewsClientObjectPool"/>
	</bean>

  2.简单的测试项目完成后,将项目部署到jetty,启动jetty

到 JETTY_HOME 目录下,运行下面命令(在ubuntu下,上jetty后台运行):

nohup java -server -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=7080  -Dcom.sun.management.jmxremote -Xms1024m  -jar start.jar>start.out 2>&1 &
上面的命令启动7080为JMX的监控端口,同时加入了jvm时的其他参数,可根据个人需求对参数进行增减。
使用sudo netstat -nlp|grep 7080 命令查看 是否启动成功

3.使用本机jconsole监控JVM,调整系统参数配置

   在windows下运行 JAVA_HOME/bin/jconsole.exe ,创建一个远程连接,连接端口是7080,就会看到远程服务器JVM的内存信息,线程信息及cpu使用情况等
   或者使用java visualvm ,运行 visualvm后添加 jconsole等插件即可,具体操作可以google一下。

相关推荐