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