19

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

使用 JConsole,查看 java.lang/Memory/Attributes/HeapMemory 没有问题

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

需要的任何命令行选项的示例,或其他需要启动的东西的例子。

4

4 回答 4

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

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

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

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

于 2009-11-23T00:57:47.327 回答
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"));
于 2012-06-21T14:58:26.300 回答
1
// 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()));
于 2009-11-18T23:34:04.897 回答
1

这就是您远程获取 MemoryMXBean 的方式(以补充@Adamski 的答案):

MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy(
            conn, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class);
于 2017-10-13T15:52:31.823 回答