MBean是一種JavaBean,MBean往往代表的是JMX中的一種可以被管理的資源。MBean會通過接口定義,給出這些資源的一些特定操作:
屬性的讀和寫操作
可以被執行的操作
關於自己的描述信息
MXBean是一種特殊的MBean,不僅特殊在名字不一樣,主要是在於在接口中會引用到一些其他類型的類時,其表現方式的不一樣。在MXBean中,如果一個MXBean的接口定義了一個屬性是一個自定義類型,如果MXBean定義了一種自定義的類型,當JMX使用這個MXBean時,這個自定義類型就會被轉換成一種標準的類型,這些類型被稱爲開放類型,是定義在javax.management.openmbean包中的。
而這個轉換的規則是,如果是原生類型,如int或者是String,則不會有變化,但如果是其他自定義類型,則被轉換成CompositeDataSupport類,這樣,JMX調用這個MXBean提供的接口的時候,classpath下沒有這個自定義類型也是可以調用成功的,但是換做MBean,則調用發的classpath下必須存在這個自定義類型的類定義
java本身提供了一些關於線程,內存,垃圾回收和日誌等管理的MXBean和一個ManagementFactory的靜態工廠類,通過這些事先提供的類,我們可以監控java進程的線程創建,內存日誌級別和垃圾回收等,當然,我們也可以通過創建我們自己的MXBean來實現我們想實現的一些功能
以下的例子,展示瞭如何使用java自身提供的MXBean來監控一個簡單的java程序啓動的過程中啓動了哪些java線程
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
public class MXBeanDemo {
public static void main(String[] args) {
System.out.println("below is thread info:");
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] threadIds = threadMXBean.getAllThreadIds();
ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadIds);
for (ThreadInfo threadInfo : threadInfos) {
System.out.println(threadInfo.getThreadId()+": "+threadInfo.getThreadName());
}
}
}
輸出的信息如下:
我們可以看到:除了main線程之外,jvm還創建了其他的四個線程,使用了IntellijIDEA的話,還會創建 一個名爲Monitor Ctrl-Break的線程