加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java监控之ManagementFactory分析

发布时间:2020-12-14 06:22:24 所属栏目:Java 来源:网络整理
导读:div class="block"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 inter

<div class="block">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??Instrumentation Specification and only uses a set of basic data types. A JMX management application and the??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??and this allows interoperation across versions. See??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
  • Get an MXBean instance by calling the?getPlatformMXBean?or?getPlatformMXBeans?method and access the MXBean locally in the running virtual machine.
  • Construct an MXBean proxy instance that forwards the method calls to a given?MBeanServer?by calling the?getPlatformMXBean(MBeanServerConnection,Class)?or?getPlatformMXBeans(MBeanServerConnection,Class)?method. The?newPlatformMXBeanProxy?method can also be used to construct an MXBean proxy instance of a given?ObjectName. A proxy is typically constructed to remotely access an MXBean of another running virtual machine.
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 the?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

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

ObjectName
Management Interface

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

ObjectName
Management Interface ,name=collector's name,name=manager's name,name=pool's namejava.nio:type=BufferPool,name=pool name

实例1:

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> JMXUtils {

</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;final</span> <span style="color: #0000ff;"&gt;static</span> MBeanServer DEFAULT_MBEAN_SERVER =<span style="color: #000000;"&gt; ManagementFactory
        .getPlatformMBeanServer();

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; getYongGC() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; getYoungGC(DEFAULT_MBEAN_SERVER);
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; getFullGC() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; getFullGC(DEFAULT_MBEAN_SERVER);
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; findLoadedClass() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; findLoadedClass(DEFAULT_MBEAN_SERVER);
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; getYoungGC(MBeanServerConnection mbeanServer) {
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        ObjectName objectName;
        </span><span style="color: #0000ff;"&gt;if</span> (mbeanServer.isRegistered(<span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=ParNew"<span style="color: #000000;"&gt;))) {
            objectName </span>= <span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=ParNew"<span style="color: #000000;"&gt;);
        } </span><span style="color: #0000ff;"&gt;else</span> <span style="color: #0000ff;"&gt;if</span> (mbeanServer.isRegistered(<span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=Copy"<span style="color: #000000;"&gt;))) {
            objectName </span>= <span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=Copy"<span style="color: #000000;"&gt;);
        } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
            objectName </span>= <span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge"<span style="color: #000000;"&gt;);
        }
        </span><span style="color: #0000ff;"&gt;return</span> (Long) mbeanServer.getAttribute(objectName,"CollectionCount"<span style="color: #000000;"&gt;);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; RuntimeException(e);
    }
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; getFullGC(MBeanServerConnection mbeanServer) {
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        ObjectName objectName;
        </span><span style="color: #0000ff;"&gt;if</span> (mbeanServer.isRegistered(<span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"<span style="color: #000000;"&gt;))) {
            objectName </span>= <span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"<span style="color: #000000;"&gt;);
        } </span><span style="color: #0000ff;"&gt;else</span> <span style="color: #0000ff;"&gt;if</span> (mbeanServer.isRegistered(<span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"<span style="color: #000000;"&gt;))) {
            objectName </span>= <span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"<span style="color: #000000;"&gt;);
        } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
            objectName </span>= <span style="color: #0000ff;"&gt;new</span> ObjectName("java.lang:type=GarbageCollector,name=PS MarkSweep"<span style="color: #000000;"&gt;);
        }
        </span><span style="color: #0000ff;"&gt;return</span> (Long) mbeanServer.getAttribute(objectName,"CollectionCount"<span style="color: #000000;"&gt;);
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; RuntimeException(e);
    }
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; findLoadedClass(MBeanServerConnection mBeanServer) {
    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
        </span><span style="color: #0000ff;"&gt;return</span> (Long) (mBeanServer.getAttribute(<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ObjectName(
                </span>"java.lang:type=ClassLoading"),"TotalLoadedClassCount"<span style="color: #000000;"&gt;));
    } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; RuntimeException(e);
    }
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; traceOneDomain(String doMain,MBeanServerConnection mBeanServer)
        </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; MalformedObjectNameException,IntrospectionException,InstanceNotFoundException,AttributeNotFoundException,ReflectionException,MBeanException,IOException {

    Set</span><ObjectInstance> set = mBeanServer.queryMBeans(<span style="color: #0000ff;"&gt;new</span> ObjectName(doMain + ":*"),<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; QueryExp() {
        </span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;final</span> <span style="color: #0000ff;"&gt;long</span> serialVersionUID = 1L<span style="color: #000000;"&gt;;

        @Override
        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; apply(ObjectName name)
                </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; BadStringOperationException,BadBinaryOpValueExpException,BadAttributeValueExpException,InvalidApplicationException {
            </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
        }

        @Override
        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setMBeanServer(MBeanServer s) {}
    });
    </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (ObjectInstance objectInstance : set) {
        System.out.println(</span>"ttt" + objectInstance.getObjectName() + "t"
                +<span style="color: #000000;"&gt; objectInstance.getClassName());
        traceMebeanInfo(mBeanServer,objectInstance.getObjectName());
    }
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; traceMebeanInfo(MBeanServerConnection mBeanServer,ObjectName objectName) </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; IntrospectionException,MalformedObjectNameException,IOException {
    MBeanInfo mBeanInfo </span>=<span style="color: #000000;"&gt; mBeanServer.getMBeanInfo(objectName);
    MBeanAttributeInfo[] mBeanAttributes </span>=<span style="color: #000000;"&gt; mBeanInfo.getAttributes();

    System.out.println(</span>"tttMBeanInfos : "<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (MBeanAttributeInfo mBeanAttribute : mBeanAttributes) {
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
            System.out.println(</span>"ttttt"
                    +<span style="color: #000000;"&gt; mBeanAttribute.getName()
                    </span>+ "t"
                    +<span style="color: #000000;"&gt; mBeanAttribute.getType()
                    </span>+ "tvalue = >"
                    +<span style="color: #000000;"&gt; mBeanServer.getAttribute(objectName,mBeanAttribute.getName()));
        } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (RuntimeMBeanException e) {
            </span><span style="color: #0000ff;"&gt;if</span> (e.getCause() <span style="color: #0000ff;"&gt;instanceof</span><span style="color: #000000;"&gt; UnsupportedOperationException) {
                System.out.println(</span>"ttttt" +<span style="color: #000000;"&gt; mBeanAttribute.getName()
                        </span>+ "t" +<span style="color: #000000;"&gt; mBeanAttribute.getType()
                        </span>+ "tvalue = > value not supported"<span style="color: #000000;"&gt;);
            }
        }

    }
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; traceAll(MBeanServerConnection mBeanServer)
        </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; MalformedObjectNameException,IOException {
    System.out.println(</span>"MBean count = " +<span style="color: #000000;"&gt; mBeanServer.getMBeanCount());
    String[] domains </span>=<span style="color: #000000;"&gt; mBeanServer.getDomains();
    </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (String domain : domains) {
        System.out.println(</span>"tbegin trace domain -> " +<span style="color: #000000;"&gt; domain);
        traceOneDomain(domain,mBeanServer);
    }
}

}

实例2:

JVM Memory Monitor <<Memory MXBean <Heap Memory Usage< <Non-Heap Memory Usage< < <<Memory Pool MXBeans < << <Type< <Usage< <Peak Usage< <Collection Usage< <

另外的方式:

:设置JVM堆的‘老生代’的大小          NewRatio  = 8         //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率          SurvivorRatio = 8    //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值           PermSize= 16.0MB       //对应jvm启动参数-XX:PermSize=:设置JVM堆的‘永生代’的初始大小           MaxPermSize=64.0MB  //对应jvm启动参数-XX:MaxPermSize=:设置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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

ObjectName