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

Tho*_*ing 18 java jmx

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

使用JConsole,我可以毫不费力地查看java.lang/Memory/Attributes/HeapMemory

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

需要的任何命令行选项的示例,或其他需要启动的内容.

Kir*_*lin 18

您需要设置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");
}
Run Code Online (Sandbox Code Playgroud)

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

-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Run Code Online (Sandbox Code Playgroud)

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


Gra*_*ray 5

@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"));
Run Code Online (Sandbox Code Playgroud)