Java理論與實踐:用JMX檢測應用程式

來源:互聯網
上載者:User

有多少次您曾經注視著運行中的應用程式,問自己:“它到底在做什嗎?為 什麼用了這麼長時間呢?” 在這些時刻,您可能會想如果自己在應用程式中構 建了更多的監視功能就好了。例如,在伺服器應用程式中,能夠查看排隊等候處 理的任務的數量和類型、當前正在處理的任務、過去一分鐘或一小時內的輸送量 統計、平均任務處理時間等。這些統計值容易搜集,但是在需要資料的時候,如 果沒有非侵入性的資料檢索機制,那麼這些值就不太有用。

可以用許多方式匯出操作性資料——可以把周期性統計快照寫入記錄檔、 建立 Swing GUI、使用內嵌的 HTTP 伺服器在 Web 頁面上顯示統計值或者發布 可以用來查詢應用程式的 Web 服務。但是在缺少監視和資料發布基礎設施的情 況下,多數應用程式開發人員都做不到這些,因此造成對應用程式工作情況的了 解要比預期的少很多。

JMX

在 Java 5.0 中,類庫和和 JVM 提供了一種全面的管理和監視基礎設施—— JMX。JMX 是一種用來提供可以遠端存取的管理介面的標準措施,也是一種嚮應 用程式添加靈活且強大的管理介面的簡易方式。被稱作受管 bean(MBean)的 JMX 組件,是提供與實體的管理有關的訪問器和業務方法的 JavaBean。每個受 管的實體(可能是整個應用程式或應用程式中的服務)執行個體化一個 MBean 並用 可讀懂的名稱註冊它。支援 JMX 的應用程式依賴於 MBeanServer,它充當 MBean 的容器,提供遠端存取、命名空間管理和安全服務。在用戶端,jconsole 工具可以充當統一的 JMX 客戶機。結合兩者,對 JMX 的平台支援極大地降低了 使應用程式支援外部管理介面所需的工作和努力。

除了提供 MBeanServer 實現,Java SE 5.0 還提供 JVM 以更方便地瞭解內 存管理、類裝入、活動線程、日誌和平台配置的狀態。多數平台服務的監視和管 理在預設情況下都是開啟的(效能影響最小),所以只需要串連應用程式與 JMX 客戶機即可。圖 1 給出了 jconsole JMX 客戶機(JDK 的一部分) ,它顯示了 其中一個記憶體管理檢視——一段時間內的堆使用方式。Perform GC 按鈕則證明 了 JMX 可以提供 除了查看操作統計值之外的初始化操作的功能。

圖 1. 用 jconsole 查看堆使用方式

傳輸和安全性

JMX 指定了在 MBeanServer 和 JMX 客戶之間通訊所使用的協議,協議可以 在各種傳輸機制上運行。可以使用針對本地串連的內建傳輸,及通過 RMI、 socket 或 SSL 的遠程傳輸(可以通過 JMX Connector API 建立新的傳輸)。 認證是由傳輸執行的;本地傳輸允許用相同的使用者識別碼 串連到運行在本地系統上 的 JVM;遠程傳輸可以用口令或認證進行認證。本地傳輸在 Java 6 下預設就是 啟用的。要在 Java 5.0 下啟用它,需要在 JVM 啟動時定義系統屬性 com.sun.management.jmxremote。“Monitoring and Management using JMX” 這份文檔(請參閱參考資料)描述了啟用和配置傳輸的配置步驟。

檢測 Web 服務器

檢測應用程式來使用 JMX 很容易。像其他許多遠程調用架構(RMI、EJB 和 JAX-RPC)一樣,JMX 也是基於介面的。要建立管理服務,需要建立指定管理方 法的 MBean 介面。然後可以建立一個 MBean 來實現此介面、執行個體化它及把它注 冊到 MBeanServer。

清單 1 顯示了網路服務(例如 Web 服務器)的 MBean 介面。它提供了檢索 配置資訊(例如連接埠號碼)和操作性資訊(例如服務是否啟動)的 getter。它還 包含查看和修改可配置參數(例如當前記錄層級)的 getter 和 setter,還有 調用管理操作(例如 start() 和 stop())的方法。

清單 1. 某個 Web 服務器的 MBean 介面

public interface WebServerMBean {
   public int getPort();
   public String getLogLevel();
   public void setLogLevel(String level);
   public boolean isStarted();
   public void stop();
   public void start();
}

實現 MBean 類通常非常直接明了,因為 MBean 介面要反映現有實體或服務 的屬性和管理操作。例如,MBean 中的 getLogLevel() 和 setLogLevel() 方法 會直接轉給被 Web 服務器使用的 Logger 上的 getLevel() 和 setLevel() 方 法。JMX 做了一些命名限制。例如,MBean 介面名稱必須以 MBean 結尾, FooMBean 介面的 MBean 類必須叫作 Foo。(可以用更進階的 JMX 特性——動 態 MBean 來去除這個限制。)把 MBean 註冊到預設的 MBeanServer 也很容易 ,如清單 2 所示:

清單 2. 用內建的 JMX 實現註冊 MBean

public class WebServer implements WebServerMBean { ... }
  ...
  WebServer ws = new WebServer(...);
  MBeanServer server = ManagementFactory.getPlatformMBeanServer ();
  server.registerMBean(ws, new ObjectName ("myapp:type=webserver,name=Port 8080"));

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.