使用Java提供的MXBean來監控jvm創建了哪些線程

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的線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章