早期 Java 監控需依賴 JVMPI/JVMTI + C/C++ + JNI,開發門檻高、效率低。Java SE 5 引入 JMX (Java Management Extensions),在 JDK 內建輕量級監控能力;Java SE 6 進一步擴充 API,提供系統負載、鎖/死鎖檢測、編譯監控等實戰功能,構建完整「可觀測性」基礎設施。
IT 管理系統面對異構資源(OS、DB、中間件、網絡設備),需「翻譯官」轉換為統一模型。經典架構:
JMX 即標準化的 Agent/SubAgent 框架:
javax.management.MBeanServer = Agent,提供標準訪問入口。javax.management.MBean = SubAgent,標準化資源暴露介面。java.lang.management (VM 級基礎監控) + javax.management (擴展框架)。| 類型 | 特點 | 適用場景 |
|---|---|---|
| Standard MBean | POJO + 命名約定 (XxxMBean 接口),最簡單 | 新開發監控點,約定優於配置 |
| MXBean | Standard 變體,類型映射到 OpenType,跨平台友好 | java.lang.management 內建大量使用 |
| Dynamic MBean | 實現 DynamicMBean 接口,運行期通過 MBeanInfo 暴露元數據 | 整合現有非標準組件 |
| Model MBean | Dynamic 子類,內建持久化、日誌、緩存策略 (Descriptor) | 需聲明式管理特性的企業級應用 |
| Open MBean | 參數/返回值限於基本類型及 javax.management.openmbean 類型 | 遠程管理端無領域類定義時 |
public interface ServerMonitorMBean { long getUpTime(); }
public class ServerMonitor implements ServerMonitorMBean {
private final ServerImpl target;
public ServerMonitor(ServerImpl t) { target = t; }
public long getUpTime() { return System.currentTimeMillis() - target.startTime; }
}
// 註冊
MBeanServer mbs = MBeanServerFactory.createMBeanServer();
ObjectName name = new ObjectName("demo:type=ServerMonitor");
mbs.registerMBean(new ServerMonitor(new ServerImpl()), name);
// 管理端讀取
Long up = (Long) mbs.getAttribute(name, "UpTime"); // 屬性名自動推導
通過 Descriptor 鍵值對配置緩存 (currencyTimeLimit)、持久化 (persistPolicy)、日誌 (log=T, logFile=xxx) 等,無需硬編碼。RequiredModelMBean 為規範必備實現。
OperatingSystemMXBean.getSystemLoadAverage()輕量級獲取過去 1 分鐘系統負載估值,高效但非精確,適用快速健康檢查,非所有平台支持。
LockInfo / MonitorInfoLockInfo:統一表示任意鎖 (synchronized、java.util.concurrent 鎖、AbstractOwnableSynchronizer 子類)。MonitorInfo:專指 synchronized 對象鎖。從 ThreadInfo 獲取:
getLockedMonitors():持有的對象鎖列表。getLockedSynchronizers():持有的 JUC 鎖列表。getLockInfo():正在等待的鎖。ThreadMXBean.findDeadlockedThreads()返回死鎖線程 ID 數組,耗時較大,**僅建議調試/診斷階段使用**,不可放入高頻監控循環。
MemoryPoolMXBean每個池 (Eden、Survivor、Old、Metaspace 等) 獨立暴露:使用量/峰值/最大值/閾值通知,支持精準 GC 調優。
@ManagedAttribute 等)。核心方向:**易用性、動態性、互操作性**。
Java SE 6 將 JMX 從「有了標準」推向「好用實用」:系統負載、鎖/死鎖可視化、聲明式 Model MBean 策略,配合 java.lang.management 开箱即用的 MXBean,讓 Java 應用擁有了生產級可觀測性基因,無需重型 APM 代理即可構建輕量監控體系。