How do I access memory usage programmatically via JMX?

后端 未结 4 1676
[愿得一人]
[愿得一人] 2020-11-29 11:28

I\'m looking for sample Java JMX code to access the values of JMX attributes from another VM.

With JConsole, I have no problem looking at java.lang/Memory/Attributes

相关标签:
4条回答
  • 2020-11-29 11:28

    @Kire's answer looks good but I thought I'd add some details about my SimpleJMX package. It contains server support that allows you to export beans easily and also includes a simple client interface that works against any JVM that exports JMX information.

    To access memory usage you'd do something like:

    JmxClient client = new JmxClient("some.host.name", somePortNumber);
    // get the memory composite information
    CompositeData composite =
          (CompositeData)client.getAttribute(new ObjectName("java.lang:type=Memory"),
                                             "HeapMemoryUsage");
    System.out.println(composite.get("committed"));
    
    0 讨论(0)
  • 2020-11-29 11:31
    // Retrieve memory managed bean from management factory.
    MemoryMXBean memBean = ManagementFactory.getMemoryMXBean() ;
    MemoryUsage heap = memBean.getHeapMemoryUsage();
    MemoryUsage nonHeap = memBean.getNonHeapMemoryUsage();
    
    // Retrieve the four values stored within MemoryUsage:
    // init: Amount of memory in bytes that the JVM initially requests from the OS.
    // used: Amount of memory used.
    // committed: Amount of memory that is committed for the JVM to use.
    // max: Maximum amount of memory that can be used for memory management.
    System.err.println(String.format("Heap: Init: %d, Used: %d, Committed: %d, Max.: %d",
      heap.getInit(), heap.getUsed(), heap.getCommitted(), heap.getMax()));
    System.err.println(String.format("Non-Heap: Init: %d, Used: %d, Committed: %d, Max.: %d",
      nonHeap.getInit(), nonHeap.getUsed(), nonHeap.getCommitted(), nonHeap.getMax()));
    
    0 讨论(0)
  • 2020-11-29 11:34

    This is how you get the MemoryMXBean remotely (to complement @Adamski's answer):

    MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy(
                conn, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class);
    
    0 讨论(0)
  • 2020-11-29 11:46

    You need to setup a JMXConnector. Here is a code snippet that will get the committed heap memory usage on a remote machine.

    String host ="myHost";
    int port = 1234;
    HashMap map = new HashMap();
    String[] credentials = new String[2];
    credentials[0] = user;
    credentials[1] = password;
    map.put("jmx.remote.credentials", credentials);
    JMXConnector c = JMXConnectorFactory.newJMXConnector(createConnectionURL(host, port), map);
    c.connect();
    Object o = c.getMBeanServerConnection().getAttribute(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage");
    CompositeData cd = (CompositeData) o;
    System.out.println(cd.get("committed"));
    
    private static JMXServiceURL createConnectionURL(String host, int port) throws MalformedURLException
    {
        return new JMXServiceURL("rmi", "", 0, "/jndi/rmi://" + host + ":" + port + "/jmxrmi");
    }
    

    If you don't care about security you can set the map to null. You need to start up the remote server with;

    -Dcom.sun.management.jmxremote.port=1234
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    

    You might want to take a look at wlshell which is a small utility that allows you to access MBeans on a remote server using a text interface or a script, It can be used with WebLogic, but it works for any Java program where you have enabled remote monitoring.

    0 讨论(0)
提交回复
热议问题