`
jiakechong
  • 浏览: 207426 次
社区版块
存档分类
最新评论

JMX 平台MXBean

    博客分类:
  • java
jmx 
阅读更多
from http://1985wanggang.blog.163.com/blog/static/7763833201258112117110/

JAVA 平台MXBean 是一种托管 Bean,它符合 JMX Instrumentation Specification,提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。
JAVA 平台MXBean:
ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口。
CompilationMXBean 用于 Java 虚拟机的编译系统的管理接口。
GarbageCollectorMXBean 用于 Java 虚拟机的垃圾回收的管理接口。
MemoryManagerMXBean 内存管理器的管理接口。
MemoryMXBean Java 虚拟机的内存系统的管理接口。
MemoryPoolMXBean 内存池的管理接口。
OperatingSystemMXBean 用于操作系统的管理接口,Java 虚拟机在此操作系统上运行。
RuntimeMXBean Java 虚拟机的运行时系统的管理接口。
ThreadMXBean Java 虚拟机线程系统的管理接口。


Java 虚拟机的每个平台 MXBean 都具有惟一的 ObjectName,以在平台 MBeanServer 中注册。Java 虚拟机具有以下管理接口的单一实例:
管理接口 对象名称
ClassLoadingMXBean java.lang:type=ClassLoading
MemoryMXBean java.lang:type=Memory
ThreadMXBean java.lang:type=Threading
RuntimeMXBean java.lang:type=Runtime
OperatingSystemMXBean java.lang:type=OperatingSystem
MemoryManagerMXBean java.lang:type=MemoryManager


获得平台MXBean的方法:
1. 通过调用 ManagementFactory.getClassLoadingMXBean() 方法
2. 平台 MBeanServer 方法获得.
MBeanServer server = ManagementFactory.createPlatformMBeanServer();
MBeanInfo info = server.getMBeanInfo(new ObjectName("java.lang:type=ClassLoading")); // 通过ClassLoading的ObjectName,查找MBean为管理而公开的属性和操作。
server.getAttribute(new ObjectName("java.lang:type=ClassLoading"), "TotalLoadedClassCount") //返回自 Java 虚拟机开始执行到目前已经加载的类的总数。


ClassLoadingMXBean能获取的数据:
getLoadedClassCount()
返回当前加载到 Java 虚拟机中的类的数量。
getTotalLoadedClassCount()
返回自 Java 虚拟机开始执行到目前已经加载的类的总数。
getUnloadedClassCount()
返回自 Java 虚拟机开始执行到目前已经卸载的类的总数。


MemoryMXBean能获取的数据:
gc()
运行垃圾回收器。
MemoryUsage getHeapMemoryUsage()
返回用于对象分配的堆的当前内存使用量。
MemoryUsage getNonHeapMemoryUsage()
返回 Java 虚拟机使用的非堆内存的当前使用量。

ThreadMXBean能获取的数据:
getAllThreadIds()
返回活动线程 ID。
getCurrentThreadCpuTime()
返回当前线程的总 CPU 时间(以毫微秒为单位)。
getCurrentThreadUserTime()
返回当前线程在用户模式中执行的 CPU 时间(以毫微秒为单位)。
getDaemonThreadCount()
返回活动守护线程的当前数目。
getPeakThreadCount()
返回自从 Java 虚拟机启动或峰值重置以来峰值活动线程计数。
getThreadCount()
返回活动线程的当前数目,包括守护线程和非守护线程。
getThreadCpuTime(long id)
返回指定 ID 的线程的总 CPU 时间(以毫微秒为单位)。
ThreadInfo getThreadInfo(long id)
返回指定 id 的不具有堆栈跟踪的线程的线程信息。


RuntimeMXBean能获取的数据:
getBootClassPath()
返回由引导类加载器用于搜索类文件的引导类路径。
String getClassPath()
返回系统类加载器用于搜索类文件的 Java 类路径。
List<String> getInputArguments()
返回传递给 Java 虚拟机的输入变量,其中不包括传递给 main 方法的变量。
String getLibraryPath()
返回 Java 库路径。
String getManagementSpecVersion()
返回正在运行的 Java 虚拟机实现的管理接口的规范版本。

OperatingSystemMXBean 能获取的数据:
getArch()
返回操作系统的架构。
int getAvailableProcessors()
返回 Java 虚拟机可以使用的处理器数目。
String getName()
返回操作系统名称。
String getVersion()
返回操作系统的版本

MemoryManagerMXBean能获取的数据:
getMemoryPoolNames()
返回此内存管理器管理的内存池名称。
String getName()
返回表示此内存管理器的名称。


还有一些MXBean就不全部列出来啦..

我们也可以通过特定的 MBeanServerConnection 远程访问 MXBean:
JMXServiceURL url = new JMXServiceURL("rmi", "", 0, /jndi/rmi://" + host + ":" + port + "/jmxrmi);
JMXConnector jmxc = JMXConnectorFactory.connect(url);
MBeanServerConnection server = jmxc.getMBeanServerConnection();


public static <T> T newPlatformMXBeanProxy(MBeanServerConnection connection,
String mxbeanName,
Class<T> mxbeanInterface)
返回用于给定 MXBean 名称的平台 MXBean 接口的代理,以便通过给定 MBeanServerConnection 转发其方法调用。

ClassLoadingMXBean mxClassLoadingMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.CLASS_LOADING_MXBEAN_NAME, ClassLoadingMXBean.class);
CompilationMXBean mxCompilationMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.COMPILATION_MXBEAN_NAME, CompilationMXBean.class);
OperatingSystemMXBean mxOperatingSystemMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);
RuntimeMXBean mxRuntimeMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.RUNTIME_MXBEAN_NAME, RuntimeMXBean.class);
GarbageCollectorMXBean mxGarbageCollectorMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE, GarbageCollectorMXBean.class);
MemoryManagerMXBean mxMemoryManagerMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE, MemoryManagerMXBean.class);
MemoryPoolMXBean mxMemoryPoolMXBean = ManagementFactory.newPlatformMXBeanProxy(mBeanServerConnection, ManagementFactory.MEMORY_POOL_MXBEAN_DOMAIN_TYPE, MemoryPoolMXBean.class);

使用 MXBean 代理可以方便地远程访问正在运行的虚拟机的平台 MXBean。
所有对 MXBean 代理的方法调用都被转发到 MBeanServerConnection,当连接器服务器出现通信问题时,可能在其中抛出 IOException。
如果使用代理远程访问平台 MXBean 的应用程序要访问 MBeanServerConnector 接口,则应该准备捕获 IOException


Java的虚拟机JVM详细讲解(2) Java的虚拟机JVM详细讲解(1) Java虚拟机 Java运行环境JRE和Java虚拟机JVM有什么关系? java虚拟机类装载:原理、实现与应用


================================
奇技淫巧之JMX BEAN的实现(2011
http://blog.sina.com.cn/s/blog_46d0362d0100qlke.html

Java中的Management Bean有两种类型 MBean和MXBean区别如下:
1.MBean只能支持primitive类型的attribute,因此多个属性无法同一时刻得到snapshot
2.MXBean可以支持composite类型(自定义对象)的attribute,可以通过复合类型同时获取关联多个属性同一时刻snapshot

实现management bean的步骤:
1.定义bean接口,如扩展型***MXBean,普通型***MBean
public static interface LargeAccountMXBean {
    String getProxyCode();

    void setProxyCode(String code);

    AppAttribute getAppAttribute(String appName);

    AppAttribute[] getAllAppAttribute();

    void setAppAttribute(String appName, String trigger, String code);
}

2.实现bean的接口(StandardMBean并非一定要继承)
public static class LargeAccount extends StandardMBean implements LargeAccountMXBean {}

3.加入到JMX Server中
mbeanServer = ManagementFactory.getPlatformMBeanServer();
mbeanServer = (MBeanServer) context.lookup("java:comp/jmx/runtime");
largeAccountMBean = new ObjectName("com.foo:Name=Service,Type=LargeAccount");
LargeAccount la = new LargeAccount(shortCode, array);
mbeanServer.registerMBean(la, largeAccountMBean);

4.获取并操作management bean
LargeAccountMXBean mxBeanProxy = JMX.newMXBeanProxy(mbeanServer, largeAccountMBean, LargeAccountMXBean.class);

这样算是做好了一个management bean,但如果用jconsole来查看就有不便之处,attribute的name以及set的parameter均显示为a,b等字目,而无法辨别其作用。需要override bean的两个方法
分享到:
评论

相关推荐

    JMX、MXBean学习

    Java Management Extensions(JMX)是Java平台中用于管理和监控应用程序的一种技术。它提供了一种标准的方式来管理和监控Java应用程序的各种资源,如内存、线程、系统属性等。JMX允许开发者创建可管理的组件,称为...

    最简单JMX例子

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、服务和设备。JMX允许开发者创建管理接口,以便在运行时收集和操作应用的状态信息。本示例是一个简单的JMX实现,适合初学者...

    JMX in Action

    第十三章探讨了如何在 J2EE 平台上使用 JMX,特别是如何将 JMX 与 Java 消息服务 (JMS) 集成起来。这一章节涵盖了以下主题: 1. **JMS 概述**: 对 JMS 进行简要概述。 2. **JMX 与 JMS 的集成**: 如何利用 JMX 来...

    使用JMX监控Zookeeper状态Java API

    例如,使用ManagementFactory类可以获取MXBean实例,然后使用这些实例来监控Zookeeper的状态。 在使用JMX监控Zookeeper状态时,需要在Zookeeper服务器上启用JMX。可以在Zookeeper的配置文件中添加以下配置: ``` ...

    JDK15-java-management-extensions-guide.pdf

    Java 管理扩展(Java Management Extensions,JMX)是 Java 平台标准版的一部分,提供了一种统一的方式来监控和管理 Java 应用程序。JDK 15 Java 管理扩展指南是 Oracle 公司发布的一份官方文档,旨在帮助开发者和...

    [课堂课件讲解]Java微服务实践-Spring Boot 监管.pptx

    JMX 是 Java 平台的一部分,提供了构建分布式、Web、模块化的工具,以及管理和监控设备和应用的动态解决方案。 JMX 的架构概况包括设备级别、代理级别和分布式服务级别。设备级别是指 Instrumentation Level,代理...

    mbean的样例代码

    在这里,我们使用了`@MXBean`注解来标记这个接口,这告诉JMX这是一个MBean接口。`getMessage`和`setMessage`方法分别用于读取和设置`message`属性,而`printMessage`方法则执行特定的操作。 接下来,我们需要实现这...

    Java SE 6 中监视和诊断性能问题1

    首先,Java SE 5 的`java.lang.management`包通过定义9个MXBeans(管理扩展Bean)为平台监控提供了基础。这些MXBeans代表了JVM的各个关键组件,如类加载器、编译器、内存、线程、运行时、操作系统、垃圾收集器、内存...

    JBOSS使用指南

    - 可以创建一个简单的MBean作为示例,例如通过实现`javax.management.MXBean`接口或标注类为`@MXBean`来定义管理接口。 - **3.2 程序代码** - 实现具体的业务逻辑方法,并暴露给JMX客户端进行调用。 - **3.3 配置...

    java监控开发示例

    对于远程监控,我们需要使用`MXBean`(Managed Beans)和JMX(Java Management Extensions)框架,它们允许我们定义、注册和管理可远程访问的管理对象。 要实现远程监控Windows系统,我们可以使用Java的`rmi`...

    JKADZS5.rar_java报刊

    MXBean是一种特殊的Java对象,可以通过JMX注册并暴露其管理特性。`ManagementFactoryHelper.java`可能包含帮助类,简化了获取和操作管理工厂的代码。 3. **线程管理**:`ThreadInfoCompositeData.java`和`...

    java读取CPU内存信息

    为了更好地监控系统资源,Java还提供了`java.lang.management`包下的其他MXBean,如`MemoryPoolMXBean`,它用于获取各个内存池的详细信息,这对于诊断内存泄漏或优化内存配置非常有用。同时,`...

Global site tag (gtag.js) - Google Analytics