获取JVM运行状况的几种方式
来源:互联网 发布:靠谱的日本代购淘宝店 编辑:程序博客网 时间:2024/06/06 14:22
我们可以通过JMX的方式读取到JVM Manage定义的MBean,如下是3种获取方法
1.监控应用与被监控应用位于同一JVM
- MBeanServer server = ManagementFactory.getPlatformMBeanServer();
- RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(server,
- "java.lang:type=Runtime", RuntimeMXBean.class);
2.监控应用与被监控应用不位于同一JVM
1)首先在被监控的JVM的启动参数中加入如下的启动参数以启JVM代理
2)连接到代理上
- JMXServiceURL url = new JMXServiceURL(
- "service:jmx:rmi:///jndi/rmi://127.0.0.1:8000/jmxrmi");
- JMXConnector connector = JMXConnectorFactory.connect(url);
- RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector
- .getMBeanServerConnection(),"java.lang:type=Runtime",
- RuntimeMXBean.class);
3.监控应用与被监控应用不位于同一JVM但在同一物理主机上(2的特化情况,通过进程Attach)
我们使用JDK工具,如jmap、jstack等的时候,工具所在的JVM当然与被监控的JVM不是同一个,所以不能使用方式1,被监控的JVM一般也不会在启动参数中增加JMX的支持,所以方式2也没有办法。还好Sun JVM给我们提供了第3种非标准的方式,就是通过Attach到被监控的JVM进程,并在被监控的JVM中启动一个JMX代理,然后使用该代理通过2的方式连接到被监控的JVM的JMX上。下面是一个使用范例,由于里面使用到的知识涉及到Java Instrutment(JVMTI的一个技术的Java实现)和Attach API,因此此处不做详细解析,在后续看完Java Instrutment和Attach API自然就会明白。(注意,仅在JDK6+中支持,另外,运行需要jdk的tools.jar包)
- //Attach 到5656的JVM进程上,后续Attach API再讲解
- VirtualMachine virtualmachine = VirtualMachine.attach("5656");
- //让JVM加载jmx Agent,后续讲到Java Instrutment再讲解
- String javaHome = virtualmachine.getSystemProperties().getProperty("java.home");
- String jmxAgent = javaHome + File.separator + "lib" + File.separator + "management-agent.jar";
- virtualmachine.loadAgent(jmxAgent, "com.sun.management.jmxremote");
- //获得连接地址
- Properties properties = virtualmachine.getAgentProperties();
- String address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress");
- //Detach
- virtualmachine.detach();
- JMXServiceURL url = new JMXServiceURL(address);
- JMXConnector connector = JMXConnectorFactory.connect(url);
- RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector
- .getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);
三、结束语
可以看到,通过标准的接口,我们已经可以获得运行的JVM很详细的信息,从运行JVM、操作系统,到内存、GC和线程,通过这些标准的接口我们已经可以对JVM进行功能完善的监控。但是仅此是不够的,这部分接口描述的主要是JVM的总体性的信息,而无法提供更多的细节。在下一部分,我们将使用JPDA来更深入地了解JVM内部信息更细节的信息,并了解我们如何通过JVM TI实现自动的性能监控
- 获取JVM运行状况的几种方式
- jvm的几种终止方式的实现
- Spring获取Bean的几种方式
- Spring获取Bean的几种方式
- 获取时间的几种方式
- Spring获取Bean的几种方式
- Spring获取Bean的几种方式
- Spring获取Bean的几种方式
- Jquery 获取对象的几种方式
- 获取客户端IP的几种方式
- Jquery 获取对象的几种方式
- Jquery 获取对象的几种方式
- Jquery 获取对象的几种方式
- 几种获取屏幕大小的方式。
- 获取applicationContext的几种方式
- Spring获取Bean的几种方式
- Jquery 获取对象的几种方式
- Jquery 获取对象的几种方式
- 也谈virtual
- 常用的运行命令
- 为什么要将thread对象post到handler中执行呢?
- mongodb 查询要点说明
- js判断年龄是否为数字
- 获取JVM运行状况的几种方式
- 出色的职业经理人共有的一些特征
- 软件工程师的出路在哪里?
- 结构化稀疏----Learning with Structured Sparsity(学习与结构化稀疏)
- Mysql与Sqlite重置 设置AUTO_INCREMENT
- hdu 2076
- 电力系统的颜色
- 我的学车旅程
- 关于web.xml配置的小计