java监控之ManagementFactory分析

The ManagementFactory class is a factory class for getting managed beans for the Java platform. This class consists of static methods each of which returns one or more platform MXBeans representing the management interface of a component of the Java virtual machine.

Platform MXBeans

A platform MXBean is a managed bean that conforms to the JMX Instrumentation Specification and only uses a set of basic data types. A JMX management application and the platform MBeanServer can interoperate without requiring classes for MXBean specific data types. The data types being transmitted between the JMX connector server and the connector client are open types and this allows interoperation across versions. See the specification of MXBeans for details.

Each platform MXBean is a PlatformManagedObject and it has a unique ObjectName for registration in the platform MBeanServer as returned by by the getObjectName method.

An application can access a platform MXBean in the following ways:

1. Direct access to an MXBean interface
2. Indirect access to an MXBean interface via MBeanServer
  • Go through the platform MBeanServer to access MXBeans locally or a specific MBeanServerConnection to access MXBeans remotely. The attributes and operations of an MXBean use only JMX open types which include basic data types, CompositeData, and TabularData defined in OpenType. The mapping is specified in theMXBean specification for details.

The getPlatformManagementInterfaces method returns all management interfaces supported in the Java virtual machine including the standard management interfaces listed in the tables below as well as the management interfaces extended by the JDK implementation.

A Java virtual machine has a single instance of the following management interfaces:

Management Interface ObjectName
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
PlatformLoggingMXBean java.util.logging:type=Logging

A Java virtual machine has zero or a single instance of the following management interfaces.

Management Interface ObjectName
CompilationMXBean java.lang:type=Compilation

A Java virtual machine may have one or more instances of the following management interfaces.

Management Interface ObjectName
GarbageCollectorMXBean java.lang:type=GarbageCollector,name=collector‘s name
MemoryManagerMXBean java.lang:type=MemoryManager,name=manager‘s name
MemoryPoolMXBean java.lang:type=MemoryPool,name=pool‘s name
BufferPoolMXBean java.nio:type=BufferPool,name=pool name

实例1:

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.Set;
import javax.management.AttributeNotFoundException;
import javax.management.BadAttributeValueExpException;
import javax.management.BadBinaryOpValueExpException;
import javax.management.BadStringOperationException;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.InvalidApplicationException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.QueryExp;
import javax.management.ReflectionException;
import javax.management.RuntimeMBeanException;

public class JMXUtils {

    private final static MBeanServer DEFAULT_MBEAN_SERVER = ManagementFactory
            .getPlatformMBeanServer();

    public static long getYongGC() {
        return getYoungGC(DEFAULT_MBEAN_SERVER);
    }

    public static long getFullGC() {
        return getFullGC(DEFAULT_MBEAN_SERVER);
    }

    public static long findLoadedClass() {
        return findLoadedClass(DEFAULT_MBEAN_SERVER);
    }

    public static long getYoungGC(MBeanServerConnection mbeanServer) {
        try {
            ObjectName objectName;
            if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) {
                objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew");
            } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) {
                objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy");
            } else {
                objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge");
            }
            return (Long) mbeanServer.getAttribute(objectName , "CollectionCount");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static long getFullGC(MBeanServerConnection mbeanServer) {
        try {
            ObjectName objectName;
            if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"))) {
                objectName = new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep");
            } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"))) {
                objectName = new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact");
            } else {
                objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS MarkSweep");
            }
            return (Long) mbeanServer.getAttribute(objectName , "CollectionCount");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static long findLoadedClass(MBeanServerConnection mBeanServer) {
        try {
            return (Long) (mBeanServer.getAttribute(new ObjectName(
                    "java.lang:type=ClassLoading"), "TotalLoadedClassCount"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void traceOneDomain(String doMain,
            MBeanServerConnection mBeanServer)
            throws MalformedObjectNameException, IntrospectionException,
            InstanceNotFoundException, AttributeNotFoundException,
            ReflectionException, MBeanException, IOException {

        Set<ObjectInstance> set = mBeanServer.queryMBeans(new ObjectName(doMain + ":*"), new QueryExp() {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean apply(ObjectName name)
                    throws BadStringOperationException,
                    BadBinaryOpValueExpException,
                    BadAttributeValueExpException, InvalidApplicationException {
                return true;
            }

            @Override
            public void setMBeanServer(MBeanServer s) {}
        });
        for (ObjectInstance objectInstance : set) {
            System.out.println("\t\t\t" + objectInstance.getObjectName() + "\t"
                    + objectInstance.getClassName());
            traceMebeanInfo(mBeanServer, objectInstance.getObjectName());
        }
    }

    public static void traceMebeanInfo(MBeanServerConnection mBeanServer,
            ObjectName objectName) throws IntrospectionException,
            InstanceNotFoundException, MalformedObjectNameException,
            ReflectionException, AttributeNotFoundException, MBeanException,
            IOException {
        MBeanInfo mBeanInfo = mBeanServer.getMBeanInfo(objectName);
        MBeanAttributeInfo[] mBeanAttributes = mBeanInfo.getAttributes();

        System.out.println("\t\t\tMBeanInfos : ");
        for (MBeanAttributeInfo mBeanAttribute : mBeanAttributes) {
            try {
                System.out.println("\t\t\t\t\t"
                        + mBeanAttribute.getName()
                        + "\t"
                        + mBeanAttribute.getType()
                        + "\tvalue = >"
                        + mBeanServer.getAttribute(objectName,
                                mBeanAttribute.getName()));
            } catch (RuntimeMBeanException e) {
                if (e.getCause() instanceof UnsupportedOperationException) {
                    System.out.println("\t\t\t\t\t" + mBeanAttribute.getName()
                            + "\t" + mBeanAttribute.getType()
                            + "\tvalue = > value not supported");
                }
            }

        }
    }

    public static void traceAll(MBeanServerConnection mBeanServer)
            throws MalformedObjectNameException, IntrospectionException,
            InstanceNotFoundException, AttributeNotFoundException,
            ReflectionException, MBeanException, IOException {
        System.out.println("MBean count = " + mBeanServer.getMBeanCount());
        String[] domains = mBeanServer.getDomains();
        for (String domain : domains) {
            System.out.println("\tbegin trace domain -> " + domain);
            traceOneDomain(domain, mBeanServer);
        }
    }
}

实例2:

<%@ page import="java.lang.management.*" %>
<%@ page import="java.util.*" %>
<html>
<head>
  <title>JVM Memory Monitor</title>
</head>
<body>
<table border="0" width="100%">
    <tr><td colspan="2" align="center"><h3>Memory MXBean</h3></td></tr>
    <tr><td width="200">Heap Memory Usage</td><td><%=ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()%></td></tr>
    <tr><td>Non-Heap Memory Usage</td><td><%=ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()%></td></tr>
    <tr><td colspan="2">&nbsp;</td></tr>
    <tr><td colspan="2" align="center"><h3>Memory Pool MXBeans</h3></td></tr>
<%
        Iterator iter = ManagementFactory.getMemoryPoolMXBeans().iterator();
        while (iter.hasNext()) {
            MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next();
%>
<tr><td colspan="2">
    <table border="0" width="100%" style="border: 1px #98AAB1 solid;">
        <tr><td colspan="2" align="center"><b><%= item.getName() %></b></td></tr>
        <tr><td width="200">Type</td><td><%= item.getType() %></td></tr>
        <tr><td>Usage</td><td><%= item.getUsage() %></td></tr>
        <tr><td>Peak Usage</td><td><%= item.getPeakUsage() %></td></tr>
        <tr><td>Collection Usage</td><td><%= item.getCollectionUsage() %></td></tr>
    </table>
</td></tr>
<tr><td colspan="2">&nbsp;</td></tr>
<%} %>
</table>
</body>
</html>

另外的方式:

内存监控的方法: 

1.  jmap -heap pid         查看java 堆(heap)使用情况 

        using thread-local object allocation.         Parallel GC with 4 thread(s)          //GC 方式 

         Heap Configuration:       //堆内存初始化配置          MinHeapFreeRatio=40     //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)          MaxHeapFreeRatio=70  //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)          MaxHeapSize=512.0MB  //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小          NewSize  = 1.0MB          //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小          MaxNewSize =4095MB   //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小          OldSize  = 4.0MB            //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小          NewRatio  = 8         //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率          SurvivorRatio = 8    //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值           PermSize= 16.0MB       //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小           MaxPermSize=64.0MB  //对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小 

Heap Usage:               //堆内存分步           PS Young Generation           Eden Space:          //Eden区内存分布             capacity = 20381696 (19.4375MB)  //Eden区总容量             used     = 20370032 (19.426376342773438MB)  //Eden区已使用             free     = 11664 (0.0111236572265625MB)  //Eden区剩余容量             99.94277218147106% used  //Eden区使用比率          From Space:        //其中一个Survivor区的内存分布              capacity = 8519680 (8.125MB)              used     = 32768 (0.03125MB)              free     = 8486912 (8.09375MB)              0.38461538461538464% used         To Space:            //另一个Survivor区的内存分布             capacity = 9306112 (8.875MB)             used     = 0 (0.0MB)             free     = 9306112 (8.875MB)             0.0% used         PS Old Generation  //当前的Old区内存分布             capacity = 366280704 (349.3125MB)             used     = 322179848 (307.25464630126953MB)             free     = 44100856 (42.05785369873047MB)             87.95982001825573% used         PS Perm Generation  //当前的 “永生代” 内存分布             capacity = 32243712 (30.75MB)             used     = 28918584 (27.57891082763672MB)             free     = 3325128 (3.1710891723632812MB)             89.68751488662348% used 

参考文献

【1】http://docs.oracle.com/javase/7/docs/api/java/lang/management/ManagementFactory.html

【2】http://blog.csdn.net/xieyuooo/article/details/9817231

【3】http://xstarcd.github.io/wiki/Java/JVM_Heap_Non-heap.html

【4】https://zhidao.baidu.com/question/1989362303218106827.html

时间: 2024-08-24 12:40:28

java监控之ManagementFactory分析的相关文章

JAVA线程池的分析和使用

http://www.infoq.com/cn/articles/java-threadPool/ 1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2. 线程池

[转]JAVA线程池的分析和使用

1. 引言 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控. 但是要做到合理的利用线程池,必须对其原理了如指掌. 2. 线程池的使用 线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池. n

Java NIO原理 图文分析及代码实现

Java NIO原理 图文分析及代码实现 博客分类: java底层 java NIO原理阻塞I/O非阻塞I/O Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术

[Java] 监控java对象回收的原理与实现

监控Java对象回收的原理与实现 一.监控Java对象回收的目的 监控Java对象是否回收的目的是:为了实现内存泄露报警. 内存泄露是指程序中对象生命周期(点击查看详情)已经进入不可见阶段,但由于编码错误或系统原因,仍然存在着GC roots持有或间接持有该对象的引用,导致该对象的生命周期无法继续向下流转,也就无法释放的现象.简单的来说即是:已实例化的对象长期被持有且无法释放或不能按照对象正常的生命周期进行释放.(点击这里查看<[Android]内存泄露排查实战手记>) 实现内存泄露报警,可以

JAVA Collection 源码分析(一)之ArrayList

到今天为止,差不多已经工作一年了,一直在做的是javaweb开发,一直用的是ssh(sh)别人写好的框架,总感觉自己现在高不成低不就的,所以就像看看java的源码,顺便学习一下大牛的思想和架构,read and write一直是提高自己编程水平的不二法门,写博客只是记录自己的学习历程,方便回顾,写的不好的地方,请多多包含,不喜勿喷,好了废话少说,现在让我们开始我们的历程把,Let's go!!!!!!!! 想看源码无从下手,不知道有没有跟我一样感觉的人们,今天用Intellij发现了可以找出类与

[JavaEE]Java NIO原理图文分析及代码实现

转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO原理及通信模型 二.java NIO服务端和客户端代码实现 具体分析: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超 时)才会返回:同

开源Java监控平台Zorka的基本使用方法

在Java的插桩工具方面,我们一直在使用Kieker,今天简单研究了另外一个Java监控平台Zorka,这里以Windows+Tomcat为例记录一下最基本的安装过程: 其主页是:http://zorka.io/,GitHub上的项目主页是:https://github.com/jitlogic/zorka,在其主页上有其Agent端的下载页面:http://zorka.io/downloads.html .下载zorka-1.0.11.zip并将其解压.将解压后的文件夹拷贝到Tomcat根目录

关于c++与java中文乱码问题分析与解决

关于c++与java中文乱码问题分析与解决 DionysosLai([email protected])  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码方式存在差异. 在java内部是使用16bit的unicode编码(即utf-16)来表示字符串,无论英文还是中文都是2字节. C/C++使用的是原始数据,ascii是一个字节,中文一般是GB2312编码,用2个字节表示一个汉字. Jni内部是使用utf-8编码表示字符串的,utf-8是扁长的unic

文《关于c++与java中文乱码问题分析与解决》中一个bug分析

文<关于c++与java中文乱码问题分析与解决>中一个bug分析 DionysosLai([email protected]) 2014/10/21 在前几篇一博客<关于c++与java中文乱码问题分析与解决>,地址如下:http://blog.csdn.net/dionysos_lai/article/details/38389765.文中详细介绍了c++与java数据传递时,为何会出现中文乱码的原因,并提出了适当的解决方法.方法如下: int CCDirector::GBKTo