如何通过JMX以编程方式访问内存使用情况?

我正在寻找示例Java JMX代码来访问来自另一个VM的JMX属性的值。

使用JConsole,我可以查看java.lang / Memory / Attributes / HeapMemory

如何从VM中运行的Java程序获取相同的信息?

所需的任何命令行选项的示例,或需要启动的其他事项。

您需要设置JMXConnector。 这是一个代码片段,它将获取远程计算机上提交的堆内存使用情况。

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"); } 

如果您不关心安全性,可以将地图设置为null。 您需要启动远程服务器;

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

您可能需要查看wlshell ,它是一个小实用程序,允许您使用文本界面或脚本访问远程服务器上的MBean。它可以与WebLogic一起使用,但它适用于已启用的任何Java程序远程监控。

@Kire的答案看起来不错,但我想我会添加一些关于SimpleJMX包的细节。 它包含允许您轻松导出bean的服务器支持,还包括一个简单的客户端接口,可以对任何导出JMX信息的JVM起作用。

要访问内存使用情况,您需要执行以下操作:

 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")); 
 // 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())); 

这就是你如何远程获取MemoryMXBean(以补充@Adamski的答案):

 MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy( conn, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class);