使用JMX监控游戏服务器

原创 2017年02月26日 13:32:08

游戏服务器运行过程中,我们希望能够对游戏里各种资源进行监控。比如,查看在线玩家总人数,查看内存使用情况,统计请求消息数量等等。这种问题归结起来就是,我们希望查看游戏进程的内存数据。

前边有一篇文章 (查看生产环境的内存数据),介绍如果通过加载类文件或使用javascript脚本查看内存数据。但这篇文章并没有介绍如何让游戏进程执行我们外部的代码,这属于跨进程通信的范畴,总体来说也是比较复杂的。

现在,我打算介绍另外一种黑科技,让监控游戏服务器更加方便快捷。

我们使用的工具叫做JMX(Java Management Extentesions),简单来说,就是对运行中的服务器进行各种资源监控的工具。

有了JMX,我们可以轻易查看游戏进程里的各种资源,甚至触发各种管理接口。

关于JMX的具体框架结构,我了解得也不深入,就不过多介绍了=。=

我们直奔主题,来点干货吧。

1.使用JMX工具,我们首先需要定义一个接口,该接口必须以MBean词尾

定义MBean接口(ControllerMBean.java)

package com.kingston.jmx;

public interface ControllerMBean {

	/**
	 * 统计在线玩家总数
	 * @return
	 */
	int getOnlinePlayerSum();
	
	/**
	 * 统计内存使用情况
	 * @return
	 */
	String getMemoryInfo();
	
	/**
	 * 执行指定脚本 
	 * @param scriptId
	 */
	void exceScript(int scriptId);
	
	/**
	 * 关服
	 */
	void closeServer();
	
}


2.MBean接口实现类(Controller.java),命名必须是对应接口的前缀(除去MBean的部分)。

类似javabean规范,mbean类也有自己的规范,例如以get开头的方法,会被转换为对应的属性。

package com.kingston.jmx;

import com.kingston.jmx.ControllerMBean;
import com.kingston.jmx.GameStarter;

public class Controller implements ControllerMBean{

	@Override
	public int getOnlinePlayerSum() {
		return 100;
	}


	@Override
	public String getMemoryInfo() {
		StringBuilder sb = new StringBuilder();
		sb.append("free:")
		  .append(Runtime.getRuntime().freeMemory())
		  .append(",\n")
		  .append("total:")
		  .append(Runtime.getRuntime().totalMemory());
		
		return sb.toString();
	}

	@Override
	public void exceScript(int scriptId) {
		System.err.println("成功执行脚步"+scriptId);
	}
	
	@Override
	public void closeServer() {
		GameStarter.run = false;
	}

}


3.MBean的宿主,也就是游戏进程(GameStarter.java)

package com.kingston.jmx;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class GameStarter {
	
	/** 允许状态 */
	public volatile static boolean run = true;
	
	public static void main(String[] args) throws Exception {
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
		 //创建MBean  
        ControllerMBean controller = new Controller();  
        
        //将MBean注册到MBeanServer中  
        mbs.registerMBean(controller, new ObjectName("GameMBean:name=controller"));  

        //模拟不停运行
        while(run) {
        	Thread.sleep(500);
        }
        System.err.println("服务关闭成功!!");
	}

}
其中ObjectName的作用是用于唯一标识具体MBean对象,稍后在gui工具就可以看到。


4. 游戏进程运行后,使用jdk自带的工具jconsole.exe(相对路径为Java/jdk1.8.0_45/bin),选择该进程



5. 将jconsole切换到mbean页签,如图



6.再点击我们创建的controler mbean下的属性按钮,可以立即看到我们所测试的两个监控指标的值,是不是非常神奇!!


7.点击操作按钮,即可看到我们为游戏进程所埋下的操作方法。选择指定方法所在的按钮,就可以触发游戏进程的方法调用了!!



8. 例如我们在 exceScript方框内输入123参数后,点执行,可以在程序终端看到打印



9. 除了使用jconsole这个工具,visiualvm也提供了同样功能的插件供下载。jmx还支持使用浏览器作为终端界面。这里就不具体介绍了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

centos6.4中安装java,编译和运行java的一个例子

centos6.4中安装java,编译和运行java的一个例子 其中java 代码如下: public class hello { public static void main(Strin...
  • hsg77
  • hsg77
  • 2015年11月22日 22:15
  • 3810

PlayMaker之开发案例

上一篇文章点击打开链接我简单介绍了PlayMaker的使用,并且也介绍了一个小的案例来初步介绍PlayMaker的使用方法 在本文我继续介绍使用PlayMaker来制作一些我们在游戏中常的游戏动画 因...

使用JMX监控Tomcat(监控应用服务器系列文章)

使用JMX监控Tomcat(监控应用服务器系列文章)  前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本), 过程也算是磕磕绊绊,...
  • ghmomo
  • ghmomo
  • 2015年11月26日 17:07
  • 130

使用JMX监控Tomcat(监控应用服务器系列文章)

1、JMX是什么?       JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平...

使用JMX监控Tomcat(监控应用服务器系列文章)

前言:本文是从“监控Tomcat方案调研(监控应用服务器系列文章一) ”一文剥离出来的,专门探讨如何使用JMX监控Tomcat,本系列文章详见本人专栏: 监控应用服务器 。     ...

使用JMX监控Tomcat(监控应用服务器系列)

 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理...

使用JMX监控Tomcat(监控应用服务器系列文章)

前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本),过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路...

JMX 远程服务器信息监控

  • 2014年11月07日 15:32
  • 16.16MB
  • 下载

JDK5和JDK6对JMX的ObjectName模式支持的不同(监控应用服务器系列文章)

前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本),过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路...

服务器-jboss--jvm检测--用JMX对Resin内存状态进行监控

用JMX对Resin内存状态进行监控   通过JMX我们可以轻松的实现对JVM的监控,运行jdk/bin目录下的jconsole程序,你就可以看到本地所有可监控的JVM实例。如果你运行的是如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用JMX监控游戏服务器
举报原因:
原因补充:

(最多只允许输入30个字)