【问题标题】:Viewing MBeans through jstatd通过 jstatd 查看 MBean
【发布时间】:2012-02-16 21:52:54
【问题描述】:

我正在尝试通过 jstatd 监视服务器上运行的所有 Java 进程。我已经把它设置好了,我可以连接到 VisualVM 并查看所有正在运行的进程。大多数显示工作正常,但某些内容(尤其是 CPU 使用率和 MBean)不显示。相反,它说:

MBeans 浏览器

数据不可用,因为无法建立与 JMX 代理的 JMX 连接。

我认为问题在于应用程序必须通过jstatd RMI 注册表而不是本地注册表“通知”,所以我尝试了以下方法(根据these suggestions),但它仍然不会显示。我试过的代码如下:

public class JmxRmiConnectorTest {
    public static void main(String[] args) throws Exception {
        Registry rmiRegistry = LocateRegistry.createRegistry(9994);
        String svc =
            "service:jmx:rmi://localhost:9994/jndi/rmi://localhost:1099/connector";

        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();

        JMXServiceURL url = new JMXServiceURL(svc);
        RMIConnectorServer rmiServer = new RMIConnectorServer(url, null, mbeanServer);
        rmiServer.start();

        Thread.sleep(100000);

        rmiServer.stop();
    }
}

当通过 jstatd 查看时,如何让我的 MBean 和 CPU 使用率显示在 VisualVM 中?

【问题讨论】:

    标签: java jmx visualvm jstatd


    【解决方案1】:

    jstatd 与 JMX 无关。 Jstatd 是Jvmstat 的代理。要获得 MBean 和 CPU 使用率,您还需要启用 JMX。有关详细信息,请参阅JMX Remote Monitoring and Management。启用 JMX 后,VisualVM 将自动检测(通过 jvmstat)它也可以使用 JMX,并将 jvmstat 和 JMX 的数据显示在一个地方。

    【讨论】:

    • 查看我发布的代码,我正在通过上面的 RMIConnectorServer 导出 JMX。所以我认为这部分已经涵盖。但是,VisualVM 并没有像您描述的那样自动建立连接,我正试图弄清楚哪里出了问题。谢谢。
    • 我认为这行不通。 VisualVM 可以通过 jvmstat 检测 JMX 连接,因为它可以(通过 jvmstat)访问受监控进程的命令行参数。请使用我上面概述的过程。设置多个命令行参数比向应用程序添加特殊代码要容易得多。
    • 谢谢,这就是关键——VisualVM 通过解析命令行参数找出如何连接。这很愚蠢。我们有一个自定义导出器,因为我们想绑定到特定的网络接口(10.x 网络而不是公共 IP)以减少我们的攻击向量。有没有办法让它与自定义导出器一起使用?
    • 这并不愚蠢。没有其他方法可以了解 JMX 连接及其配置(暴力端口扫描除外)。
    • 似乎他们可以与 RMI 注册表会合,甚至可以直接通过 jvmstat 导出该信息。我非常相信他们按原样编写的方式并不是一个真正的好方法,即使没有其他原因,您永远不能使用任何类型的自定义导出器。
    【解决方案2】:

    在远程,像这样启动 java 以启用 jmxremote。

    java -Dcom.sun.management.jmxremote \
         -Dcom.sun.management.jmxremote.port=9191 \
         -Dcom.sun.management.jmxremote.authenticate=false \
         -Dcom.sun.management.jmxremote.ssl=false \
         -Djava.rmi.server.hostname=`hostname` \
         -jar app.jar
    

    在语言环境中,使用 jps 像这样jps YOUHOSTNAME:9191

    【讨论】:

      【解决方案3】:

      仅适用于需要快速工作方法的人。 JMX 可以动态启动/停止,无需重启 JVM。 在我的情况下,动态启动 jmx 并重新启动 jvisualvm 后,JMX 和 cpu 使用正常。

      jcmd PID ManagementAgent.start jmxremote.port=9999 jmxremote.ssl=false jmxremote.authenticate=false
      

      jcmd PID ManagementAgent.stop
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多