2012-02-16 59 views
3

我想通过jstatd监视服务器上运行的所有Java进程。我已经设置了足够的设置,以便可以与VisualVM连接并查看所有正在运行的进程。大多数显示器工作正常,但某些事情(特别是CPU使用率和MBean)不显示。相反,它说:通过jstatd查看MBeans

的MBean浏览器

数据不可用,因为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(); 
    } 
} 

我怎样才能让我的MBean和CPU使用率,当通过jstatd看到VisualVM的显示?

回答

9

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

+0

查看我发布的代码,我通过上面的RMIConnectorServer导出JMX。所以我认为这一部分已经涵盖。但是,VisualVM并没有像你所描述的那样自动获取连接,而是试图找出错误的具体位置。谢谢。 – 2012-02-20 21:42:34

+1

我不认为这会奏效。 VisualVM可以通过jvmstat检测JMX连接,因为它可以访问(通过jvmstat)被监视进程的命令行参数。请使用我上面概述的过程。设置几个命令行参数比向应用程序添加特殊代码要容易得多。 – 2012-02-21 11:54:18

+0

谢谢,这是关键 - VisualVM通过解析命令行参数来计算出如何连接。这很愚蠢。我们有一个自定义导出器,因为我们想绑定到一个特定的网络接口(一个10.x网络而不是公共IP)来减少攻击向量。有没有办法让它与定制出口商合作? – 2012-02-22 23:14:00

0

在远程,启动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