|
Posted on 2009-12-21 20:51 啥都寫點(diǎn) 閱讀(398) 評論(0) 編輯 收藏 所屬分類: J2SE
本例介紹如何監(jiān)控和管理Java虛擬機(jī),包括獲取Java虛擬機(jī)的內(nèi)存使用情況、線程數(shù)、運(yùn)行時(shí)間等。J2SE 5.0中使用Bean監(jiān)控和管理Java虛擬機(jī)。
 java.lang.management.ManagementFactory是管理Bean的工廠類,通過它的get系列方法能夠獲得不同的管理Bean的實(shí)例。
 Java提供了如下幾個(gè)管理Bean:
 java.lang.management.MemoryMXBean:該Bean用于管理Java虛擬機(jī)的內(nèi)存系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)實(shí)例。
 java.lang.management.ClassLoadingMXBean:該Bean用于管理Java虛擬機(jī)的類加載系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)實(shí)例。
 java.lang.management.ThreadMXBean:該Bean用于管理Java虛擬機(jī)的線程系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)實(shí)例。
 java.lang.management.RuntimeMXBean:該Bean用于管理Java虛擬機(jī)的運(yùn)行時(shí)系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)實(shí)例。
 java.lang.management.OperatingSystemMXBean:該Bean用于管理操作系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)實(shí)例。
 java.lang.management.CompilationMXBean:該Bean用于管理Java虛擬機(jī)的編譯系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)實(shí)例。
 java.lang.management.GarbageCollectorMXBean:該Bean用于管理Java虛擬機(jī)的垃圾回收系統(tǒng)。一個(gè)Java虛擬機(jī)具有一個(gè)或者多個(gè)實(shí)例。

import java.lang.management.ClassLoadingMXBean;
import java.lang.management.CompilationMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import java.util.List;

 /** *//**
* 用戶可以通過MXBean可以管理和監(jiān)視虛擬機(jī)。
*/
 public class JDKMBean {

 /** *//**
* MemoryMXBean是Java 虛擬機(jī)的內(nèi)存系統(tǒng)的管理接口
* Java 虛擬機(jī)具有此接口的實(shí)現(xiàn)類的單一實(shí)例
*/
 public static void printMemoryMXBean() {
// 獲得單一實(shí)例
MemoryMXBean instance = ManagementFactory.getMemoryMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回用于對象分配的堆的當(dāng)前內(nèi)存使用量
System.out.printf("%s: %s%n", "HeapMemoryUsage", instance
.getHeapMemoryUsage());
// 返回 Java 虛擬機(jī)使用的非堆內(nèi)存的當(dāng)前使用量
System.out.printf("%s: %s%n", "getNonHeapMemoryUsage", instance
.getNonHeapMemoryUsage());
// 運(yùn)行垃圾回收器
instance.gc();
}

 /** *//**
* ClassLoadingMXBean是Java 虛擬機(jī)的類加載系統(tǒng)的管理接口
* Java 虛擬機(jī)具有此接口的實(shí)現(xiàn)類的單個(gè)實(shí)例
*/
 public static void printClassLoadingMXBean() {
// 獲得單一實(shí)例
ClassLoadingMXBean instance = ManagementFactory.getClassLoadingMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回當(dāng)前加載到 Java 虛擬機(jī)中的類的數(shù)量
System.out.printf("%s: %s%n", "LoadedClassCount", instance
.getLoadedClassCount());
// 返回自 Java 虛擬機(jī)開始執(zhí)行到目前已經(jīng)加載的類的總數(shù)
System.out.printf("%s: %s%n", "TotalLoadedClassCount", instance
.getTotalLoadedClassCount());
// 返回自 Java 虛擬機(jī)開始執(zhí)行到目前已經(jīng)卸載的類的總數(shù)
System.out.printf("%s: %s%n", "UnloadedClassCount", instance
.getUnloadedClassCount());
}

 /** *//**
* ThreadMXBean是Java 虛擬機(jī)線程系統(tǒng)的管理接口
* Java 虛擬機(jī)具有此接口的實(shí)現(xiàn)類的單個(gè)實(shí)例
*/
 public static void printThreadMXBean() {
// 獲得單一實(shí)例
ThreadMXBean instance = ManagementFactory.getThreadMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回活動線程的當(dāng)前數(shù)目,包括守護(hù)線程和非守護(hù)線程。
System.out.printf("%s: %s%n", "ThreadCount", instance.getThreadCount());
// 返回活動線程 ID
System.out.printf("%s: %n", "Thread IDs");
long[] ids = instance.getAllThreadIds();
 for (long id : ids) {
System.out.printf("%s; ", id);
}
System.out.printf("%n");
// 返回活動守護(hù)線程的當(dāng)前數(shù)目
System.out.printf("%s: %s%n", "DaemonThreadCount", instance
.getDaemonThreadCount());
// 返回自從 Java 虛擬機(jī)啟動或峰值重置以來峰值活動線程計(jì)數(shù)
System.out.printf("%s: %s%n", "PeakThreadCount", instance
.getPeakThreadCount());
// 返回當(dāng)前線程的總 CPU 時(shí)間
System.out.printf("%s: %s%n", "CurrentThreadCpuTime", instance
.getCurrentThreadCpuTime());
// 返回當(dāng)前線程在用戶模式中執(zhí)行的 CPU 時(shí)間
System.out.printf("%s: %s%n", "CurrentThreadUserTime", instance
.getCurrentThreadUserTime());
}

 /** *//**
* RuntimeMXBean是Java 虛擬機(jī)的運(yùn)行時(shí)系統(tǒng)的管理接口
* Java 虛擬機(jī)具有此接口的實(shí)現(xiàn)類的單個(gè)實(shí)例
*/
 public static void printRuntimeMXBean() {
// 獲得單一實(shí)例
RuntimeMXBean instance = ManagementFactory.getRuntimeMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回由引導(dǎo)類加載器用于搜索類文件的引導(dǎo)類路徑
System.out.printf("%s: %s%n", "BootClassPath", instance
.getBootClassPath());
// 返回系統(tǒng)類加載器用于搜索類文件的 Java 類路徑
System.out.printf("%s: %s%n", "ClassPath", instance.getClassPath());
// 返回傳遞給 Java 虛擬機(jī)的輸入變量,其中不包括傳遞給 main 方法的變量
System.out.printf("%s%n", "InputArguments");
List<String> args = instance.getInputArguments();
 for (String arg : args) {
System.out.printf("%s; ", arg);
}
// 返回 Java 庫路徑
System.out.printf("%s: %s%n", "LibraryPath", instance.getLibraryPath());
// 返回正在運(yùn)行的 Java 虛擬機(jī)實(shí)現(xiàn)的管理接口的規(guī)范版本
System.out.printf("%s: %s%n", "ManagementSpecVersion", instance
.getManagementSpecVersion());
// 返回表示正在運(yùn)行的 Java 虛擬機(jī)的名稱
System.out.printf("%s: %s%n", "Name", instance.getName());

// 返回 Java 虛擬機(jī)規(guī)范名稱
System.out.printf("%s: %s%n", "SpecName", instance.getSpecName());
// 返回 Java 虛擬機(jī)規(guī)范供應(yīng)商
System.out.printf("%s: %s%n", "SpecVendor", instance.getSpecVendor());
// 返回 Java 虛擬機(jī)規(guī)范版本
System.out.printf("%s: %s%n", "SpecVersion", instance.getSpecVersion());

// 返回 Java 虛擬機(jī)實(shí)現(xiàn)名稱
System.out.printf("%s: %s%n", "VmName", instance.getVmName());
// 返回 Java 虛擬機(jī)實(shí)現(xiàn)供應(yīng)商
System.out.printf("%s: %s%n", "VmVendor", instance.getVmVendor());
// 返回 Java 虛擬機(jī)實(shí)現(xiàn)版本
System.out.printf("%s: %s%n", "VmVersion", instance.getVmVersion());

// 返回 Java 虛擬機(jī)的啟動時(shí)間
System.out.printf("%s: %s%n", "StartTime", instance.getStartTime());
// 返回 Java 虛擬機(jī)的正常運(yùn)行時(shí)間
System.out.printf("%s: %s%n", "Uptime", instance.getUptime());
}

 /** *//**
* OperatingSystemMXBean是操作系統(tǒng)的管理接口
* Java 虛擬機(jī)具有此接口的實(shí)現(xiàn)類的單個(gè)實(shí)例
*/
 public static void printOperatingSystemMXBean() {
// 獲得單一實(shí)例
OperatingSystemMXBean instance = ManagementFactory
.getOperatingSystemMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回操作系統(tǒng)的架構(gòu)
System.out.printf("%s: %s%n", "Arch", instance.getArch());
// 返回 Java 虛擬機(jī)可以使用的處理器數(shù)目
System.out.printf("%s: %s%n", "AvailableProcessors", instance
.getAvailableProcessors());
// 返回操作系統(tǒng)名稱
System.out.printf("%s: %s%n", "Name", instance.getName());
// 返回操作系統(tǒng)版本
System.out.printf("%s: %s%n", "Version", instance.getVersion());
}

 /** *//**
* CompilationMXBean是Java 虛擬機(jī)的編譯系統(tǒng)的管理接口
* Java 虛擬機(jī)具有此接口的實(shí)現(xiàn)類的單個(gè)實(shí)例
*/
 public static void printCompilationMXBean() {
// 獲得單一實(shí)例
CompilationMXBean instance = ManagementFactory.getCompilationMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回即時(shí) (JIT) 編譯器的名稱
System.out.printf("%s: %s%n", "Name", instance.getName());
// 返回在編譯上花費(fèi)的累積耗費(fèi)時(shí)間的近似值
System.out.printf("%s: %s%n", "TotalCompilationTime", instance
.getTotalCompilationTime());
}

 /** *//**
* GarbageCollectorMXBean是Java 虛擬機(jī)的垃圾回收的管理接口
* Java 虛擬機(jī)可能具有此接口的實(shí)現(xiàn)類的一個(gè)或多個(gè)實(shí)例
*/
 public static void printGarbageCollectorMXBean() {
// 獲得所有實(shí)例
List<GarbageCollectorMXBean> instances = ManagementFactory
.getGarbageCollectorMXBeans();
System.out.printf("%n---%s---%n", GarbageCollectorMXBean.class
.getName());
// 遍歷每個(gè)實(shí)例
 for (GarbageCollectorMXBean instance : instances) {
// 返回垃圾收集器的名字
System.out.printf("***%s: %s***%n", "Name", instance.getName());
// 返回已發(fā)生的回收的總次數(shù)
System.out.printf("%s: %s%n", "CollectionCount", instance
.getCollectionCount());
// 返回近似的累積回收時(shí)間
System.out.printf("%s: %s%n", "CollectionTime", instance
.getCollectionTime());
}
}

 public static void main(String[] args) {
JDKMBean.printOperatingSystemMXBean();
JDKMBean.printRuntimeMXBean();
JDKMBean.printClassLoadingMXBean();
JDKMBean.printCompilationMXBean();
JDKMBean.printMemoryMXBean();
JDKMBean.printThreadMXBean();
JDKMBean.printGarbageCollectorMXBean();
}
}

-- 學(xué)海無涯
|