系列
開篇
- arthas提供Mbean命令查看或監(jiān)控 Mbean 的屬性信息深胳。
原理介紹
- MBeanServer是一個(gè)包含所有注冊(cè)MBean的倉(cāng)庫(kù).它是JMX代理層的核心.JMX1.0規(guī)范提供一個(gè)接口叫 javax.management.MBeanServer. 所有管理的在MBean操作通過(guò)MBeanServer執(zhí)行.使用MBeanServer實(shí)例,你能夠管理所有MBean.每一個(gè)MBean具有一個(gè)唯一標(biāo)志,叫ObjectName.
源碼分析
private Set<ObjectName> queryObjectNames() {
MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = new HashSet<ObjectName>();
try {
if (StringUtils.isEmpty(name)) {
name = "*:*";
}
objectNames = platformMBeanServer.queryNames(new ObjectName(name), null);
} catch (MalformedObjectNameException e) {
logger.warn("queryObjectNames error", e);
}
return objectNames;
}
private void listMetaData(CommandProcess process) {
Set<ObjectName> objectNames = queryObjectNames();
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
try {
MBeanModel mbeanModel = new MBeanModel();
Map<String, MBeanInfo> mbeanMetaData = new LinkedHashMap<String, MBeanInfo>();
mbeanModel.setMbeanMetadata(mbeanMetaData);
for (ObjectName objectName : objectNames) {
MBeanInfo mBeanInfo = mBeanServer.getMBeanInfo(objectName);
mbeanMetaData.put(objectName.toString(), mBeanInfo);
}
process.appendResult(mbeanModel);
process.end();
} catch (Throwable e) {
logger.warn("listMetaData error", e);
process.end(1, "list mbean metadata error");
}
}
- 通過(guò) ManagementFactory.getPlatformMBeanServer()獲取MBeanServer。
- 通過(guò)MBeanServer的queryNames獲取ObjectName對(duì)象玫芦。
- 通過(guò)MBeanInfo mBeanInfo = mBeanServer.getMBeanInfo(objectName)獲取MBeanInfo