|
Posted on 2009-12-21 20:51 啥都写点 阅读(387) 评论(0) 编辑 收藏 所属分类: J2SE
本例介绍如何监控和管理Java虚拟机,包括获取Java虚拟机的内存使用情况、线程数、运行时间等。J2SE 5.0中使用Bean监控和管理Java虚拟机。
java.lang.management.ManagementFactory是管理Bean的工厂类,通过它的get系列方法能够获得不同的管理Bean的实例。
Java提供了如下几个管理Bean:
java.lang.management.MemoryMXBean:该Bean用于管理Java虚拟机的内存系统。一个Java虚拟机具有一个实例。
java.lang.management.ClassLoadingMXBean:该Bean用于管理Java虚拟机的类加载系统。一个Java虚拟机具有一个实例。
java.lang.management.ThreadMXBean:该Bean用于管理Java虚拟机的线程系统。一个Java虚拟机具有一个实例。
java.lang.management.RuntimeMXBean:该Bean用于管理Java虚拟机的运行时系统。一个Java虚拟机具有一个实例。
java.lang.management.OperatingSystemMXBean:该Bean用于管理操作系统。一个Java虚拟机具有一个实例。
java.lang.management.CompilationMXBean:该Bean用于管理Java虚拟机的编译系统。一个Java虚拟机具有一个实例。
java.lang.management.GarbageCollectorMXBean:该Bean用于管理Java虚拟机的垃圾回收系统。一个Java虚拟机具有一个或者多个实例。
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可以管理和监视虚拟机。
*/
public class JDKMBean {
/** *//**
* MemoryMXBean是Java 虚拟机的内存系统的管理接口
* Java 虚拟机具有此接口的实现类的单一实例
*/
public static void printMemoryMXBean() {
// 获得单一实例
MemoryMXBean instance = ManagementFactory.getMemoryMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回用于对象分配的堆的当前内存使用量
System.out.printf("%s: %s%n", "HeapMemoryUsage", instance
.getHeapMemoryUsage());
// 返回 Java 虚拟机使用的非堆内存的当前使用量
System.out.printf("%s: %s%n", "getNonHeapMemoryUsage", instance
.getNonHeapMemoryUsage());
// 运行垃圾回收器
instance.gc();
}
/** *//**
* ClassLoadingMXBean是Java 虚拟机的类加载系统的管理接口
* Java 虚拟机具有此接口的实现类的单个实例
*/
public static void printClassLoadingMXBean() {
// 获得单一实例
ClassLoadingMXBean instance = ManagementFactory.getClassLoadingMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回当前加载到 Java 虚拟机中的类的数量
System.out.printf("%s: %s%n", "LoadedClassCount", instance
.getLoadedClassCount());
// 返回自 Java 虚拟机开始执行到目前已经加载的类的总数
System.out.printf("%s: %s%n", "TotalLoadedClassCount", instance
.getTotalLoadedClassCount());
// 返回自 Java 虚拟机开始执行到目前已经卸载的类的总数
System.out.printf("%s: %s%n", "UnloadedClassCount", instance
.getUnloadedClassCount());
}
/** *//**
* ThreadMXBean是Java 虚拟机线程系统的管理接口
* Java 虚拟机具有此接口的实现类的单个实例
*/
public static void printThreadMXBean() {
// 获得单一实例
ThreadMXBean instance = ManagementFactory.getThreadMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回活动线程的当前数目,包括守护线程和非守护线程。
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");
// 返回活动守护线程的当前数目
System.out.printf("%s: %s%n", "DaemonThreadCount", instance
.getDaemonThreadCount());
// 返回自从 Java 虚拟机启动或峰值重置以来峰值活动线程计数
System.out.printf("%s: %s%n", "PeakThreadCount", instance
.getPeakThreadCount());
// 返回当前线程的总 CPU 时间
System.out.printf("%s: %s%n", "CurrentThreadCpuTime", instance
.getCurrentThreadCpuTime());
// 返回当前线程在用户模式中执行的 CPU 时间
System.out.printf("%s: %s%n", "CurrentThreadUserTime", instance
.getCurrentThreadUserTime());
}
/** *//**
* RuntimeMXBean是Java 虚拟机的运行时系统的管理接口
* Java 虚拟机具有此接口的实现类的单个实例
*/
public static void printRuntimeMXBean() {
// 获得单一实例
RuntimeMXBean instance = ManagementFactory.getRuntimeMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回由引导类加载器用于搜索类文件的引导类路径
System.out.printf("%s: %s%n", "BootClassPath", instance
.getBootClassPath());
// 返回系统类加载器用于搜索类文件的 Java 类路径
System.out.printf("%s: %s%n", "ClassPath", instance.getClassPath());
// 返回传递给 Java 虚拟机的输入变量,其中不包括传递给 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());
// 返回正在运行的 Java 虚拟机实现的管理接口的规范版本
System.out.printf("%s: %s%n", "ManagementSpecVersion", instance
.getManagementSpecVersion());
// 返回表示正在运行的 Java 虚拟机的名称
System.out.printf("%s: %s%n", "Name", instance.getName());
// 返回 Java 虚拟机规范名称
System.out.printf("%s: %s%n", "SpecName", instance.getSpecName());
// 返回 Java 虚拟机规范供应商
System.out.printf("%s: %s%n", "SpecVendor", instance.getSpecVendor());
// 返回 Java 虚拟机规范版本
System.out.printf("%s: %s%n", "SpecVersion", instance.getSpecVersion());
// 返回 Java 虚拟机实现名称
System.out.printf("%s: %s%n", "VmName", instance.getVmName());
// 返回 Java 虚拟机实现供应商
System.out.printf("%s: %s%n", "VmVendor", instance.getVmVendor());
// 返回 Java 虚拟机实现版本
System.out.printf("%s: %s%n", "VmVersion", instance.getVmVersion());
// 返回 Java 虚拟机的启动时间
System.out.printf("%s: %s%n", "StartTime", instance.getStartTime());
// 返回 Java 虚拟机的正常运行时间
System.out.printf("%s: %s%n", "Uptime", instance.getUptime());
}
/** *//**
* OperatingSystemMXBean是操作系统的管理接口
* Java 虚拟机具有此接口的实现类的单个实例
*/
public static void printOperatingSystemMXBean() {
// 获得单一实例
OperatingSystemMXBean instance = ManagementFactory
.getOperatingSystemMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回操作系统的架构
System.out.printf("%s: %s%n", "Arch", instance.getArch());
// 返回 Java 虚拟机可以使用的处理器数目
System.out.printf("%s: %s%n", "AvailableProcessors", instance
.getAvailableProcessors());
// 返回操作系统名称
System.out.printf("%s: %s%n", "Name", instance.getName());
// 返回操作系统版本
System.out.printf("%s: %s%n", "Version", instance.getVersion());
}
/** *//**
* CompilationMXBean是Java 虚拟机的编译系统的管理接口
* Java 虚拟机具有此接口的实现类的单个实例
*/
public static void printCompilationMXBean() {
// 获得单一实例
CompilationMXBean instance = ManagementFactory.getCompilationMXBean();
System.out.printf("%n---%s---%n", instance.getClass().getName());
// 返回即时 (JIT) 编译器的名称
System.out.printf("%s: %s%n", "Name", instance.getName());
// 返回在编译上花费的累积耗费时间的近似值
System.out.printf("%s: %s%n", "TotalCompilationTime", instance
.getTotalCompilationTime());
}
/** *//**
* GarbageCollectorMXBean是Java 虚拟机的垃圾回收的管理接口
* Java 虚拟机可能具有此接口的实现类的一个或多个实例
*/
public static void printGarbageCollectorMXBean() {
// 获得所有实例
List<GarbageCollectorMXBean> instances = ManagementFactory
.getGarbageCollectorMXBeans();
System.out.printf("%n---%s---%n", GarbageCollectorMXBean.class
.getName());
// 遍历每个实例
for (GarbageCollectorMXBean instance : instances) {
// 返回垃圾收集器的名字
System.out.printf("***%s: %s***%n", "Name", instance.getName());
// 返回已发生的回收的总次数
System.out.printf("%s: %s%n", "CollectionCount", instance
.getCollectionCount());
// 返回近似的累积回收时间
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();
}
}
-- 学海无涯
|