Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

监控与管理虚拟机

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();
    }

}


 

                                                                                                       --    学海无涯