java - 如何使用 JMX 连接到 localhost jvm 上的 java 程序?

标签 java localhost rmi jmx jconsole

我应该使用 JMX 连接到本地 jvm 上的 java 程序。换句话说,我想开发一个 JMX 客户端来在 localhost 上配置一个 java 程序。

  • 不推荐使用 JConsole! JConsole不适合,因为它是通用的JMX客户端,对主程序性能有负面影响。

  • oracle 站点上的示例使用 RMIConnector 和 host:port 参数,但我不知道: 应该在哪里设置jmx端口?

  • JConsole 可以选择通过 PID 连接到 java 进程。但是我在 JMX api 中没有找到任何以 PID 作为输入参数的方法。

最佳答案

我们使用类似以下的方式以编程方式连接到我们的 JMX 服务器。您应该使用以下参数运行您的服务器:

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

要绑定(bind)到特定地址,您需要添加以下 VM 参数:

-Djava.rmi.server.hostname=A.B.C.D

然后您可以使用 JMX 客户端代码连接到您的服务器,如下所示:

String host = "localhost";  // or some A.B.C.D
int port = 1234;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
try {
   MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
   // now query to get the beans or whatever
   Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
   ...
} finally {
   jmxConnector.close();
}

我们也有可以通过编程方式将自身发布到 VM 参数之外的特定端口的代码,但这比我想象的要复杂得多。


据我所知,就“通过 pid”连接而言,您需要使用 Java6 从 Java 领域进行连接。我没有使用以下代码,但它似乎可以工作。

List<VirtualMachineDescriptor> vms = VirtualMachine.list();
for (VirtualMachineDescriptor desc : vms) {
    VirtualMachine vm;
    try {
        vm = VirtualMachine.attach(desc);
    } catch (AttachNotSupportedException e) {
        continue;
    }
    Properties props = vm.getAgentProperties();
    String connectorAddress =
        props.getProperty("com.sun.management.jmxremote.localConnectorAddress");
    if (connectorAddress == null) {
        continue;
    }
    JMXServiceURL url = new JMXServiceURL(connectorAddress);
    JMXConnector connector = JMXConnectorFactory.connect(url);
    try {
        MBeanServerConnection mbeanConn = connector.getMBeanServerConnection();
        Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
        ...
    } finally {
        jmxConnector.close();
    }
}

我也是 SimpleJMX package 的作者这使得启动 JMX 服务器和将 bean 发布到远程客户端变得容易。

// create a new server listening on port 8000
JmxServer jmxServer = new JmxServer(8000);
// start our server
jmxServer.start();
// register our lookupCache object defined below
jmxServer.register(lookupCache);
jmxServer.register(someOtherObject);
// stop our server
jmxServer.stop();

它也有一个客户端接口(interface),但现在它没有任何机制来通过 PID 查找进程——仅支持主机/端口组合(2012 年 6 月)。

关于java - 如何使用 JMX 连接到 localhost jvm 上的 java 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5552960/

相关文章:

java - 多线程程序中的Swing图形

java - 参数太少。预期1.错误

java - Java中 map 的浅拷贝

python - 当尝试执行cgi脚本时,出现错误: "[WinError 193] %1 is not a valid Win32 application"

java - 如何从接口(interface)生成 JAVA RMI stub 和骨架?

Java RMI 代码库不工作

java - 无法在 android 中解析布局名称

windows - Acunetix 可以连接本地主机

localhost - 127.x.y.z 但不是 127.0.0.0?

java - UnicastRemoteObject.exportObject(this, 0);