java - 사용법 - 자바 cpu 사용량 확인




JMX를 사용하여 localhost jvm에서 java 프로그램에 연결하는 방법? (3)

가장 단순한 의미 :

import javax.management.Attribute;
import javax.management.AttributeList;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;

// set a self JMX connection
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
// set the object name(s) you are willing to query, here a CAMEL JMX object
ObjectName objn = new ObjectName("org.apache.camel:context=*,type=routes,name=\"route*\"");
Set<ObjectName> objectInstanceNames = mBeanServer.queryNames(objn, null);
for (ObjectName on : objectInstanceNames) {
    // query a number of attributes at once
    AttributeList attrs = mBeanServer.getAttributes(on, new String[] {"ExchangesCompleted","ExchangesFailed"});
    // process attribute values (beware of nulls...)
    // ... attrs.get(0) ... attrs.get(1) ...
}

JMX를 사용하여 localhost jvm의 java 프로그램에 연결해야합니다. 즉, localhost에 자바 프로그램을 설정하기 위해 JMX 클라이언트를 개발하려고합니다.

  • JConsole을 사용하지 않는 것이 좋습니다! JConsole은 일반적인 JMX 클라이언트이고 주 프로그램 성능에 부정적인 영향을주기 때문에 JConsole은 적합하지 않습니다.

  • oracle 사이트의 샘플은 RMIConnector 및 host : port 매개 변수를 사용하지만 잘 모르겠습니다. jmx 포트는 어디에 설정해야합니까?

  • JConsole에는 PID로 java 프로세스에 연결할 수있는 옵션이 있습니다. 하지만 PID를 입력 매개 변수로 가지는 JMX API에서는 메소드를 찾지 못했습니다.


명확히하기 위해 로컬 JMX 통계 만 가져 오는 데 관심이 있다면 원격 API를 사용할 필요가 없습니다. java.lang.management.ManagementFactory 사용하면된다.

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
memoryMXBean.getHeapMemoryUsage().getMax();
...

List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
...

List<VirtualMachineDescriptor> vm = new ArrayList<VirtualMachineDescriptor>();
        jvmList = new JVMListManager();

        vm = jvmList.listActiveVM();

        for (VirtualMachineDescriptor vmD : vm) 
        {
            try
            {

            //importFrom is taking a process ID and returning a service url in a String Format
            String ServiceUrl = ConnectorAddressLink.importFrom(Integer.parseInt(vmD.id().trim()));
            JMXServiceURL jmxServiceUrl = new JMXServiceURL(ServiceUrl);

            jmxConnector = JMXConnectorFactory.connect(jmxServiceUrl, null);
            con = jmxConnector.getMBeanServerConnection();
            CompilationMXBean compMXBean = ManagementFactory.newPlatformMXBeanProxy(con
                   , ManagementFactory.COMPILATION_MXBEAN_NAME
                   , CompilationMXBean.class);
            }catch(Exception e)
            {
            //Do Something  
            }
        }


protected List listActiveVM() {
    List<VirtualMachineDescriptor> vm = VirtualMachine.list();

    return vm;
}

따라서 읽으려는 프로세스의 JVM 시작시 jmxremote 인수를 사용해야합니다. 시작시 jmxremote 인수를 전달하지 않고도이 작업을 수행 할 수 있습니다. 첨부 API를 사용해야합니다 (Java 6 이상을 사용하는 프로그램에만 해당).





jconsole