使用 java.lang.management 包监控 java 虚拟机

1. 概述

对 java 来说,jvm 的监控是工程应用中十分重要的一环,无论是日常的性能优化还是异常处理都离不开监控数据的分析。
java 的 java.lang.management 包提供了用于监控和管理 java 虚拟机及虚拟机各项指标的接口。

2. java.lang.management 提供的接口

java.lang.management 提供了下列接口。

java.lang.management 提供的接口

接口 用途
ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口
CompilationMXBean 用于 Java 虚拟机的编译系统的管理接口
GarbageCollectorMXBean 用于 Java 虚拟机的垃圾回收的管理接口
MemoryManagerMXBean 内存管理器的管理接口
MemoryMXBean Java 虚拟机的内存系统的管理接口
MemoryPoolMXBean 内存池的管理接口
OperatingSystemMXBean 用于操作系统的管理接口,Java 虚拟机在此操作系统上运行
RuntimeMXBean Java 虚拟机的运行时系统的管理接口
ThreadMXBean Java 虚拟机线程系统的管理接口

3. 应用实例

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.MemoryManagerMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import java.util.List;

import javax.management.MBeanServerConnection;

public class MBeanDemo {

   public static void main(String[] args) {
       showJvmInfo();
       showMemoryInfo();
       showSystem();
       showClassLoading();
       showCompilation();
       showThread();
       showGarbageCollector();
       showMemoryManager();
       showMemoryPool();
   }

   /**
    * Java 虚拟机的运行时系统
    */

   public static void showJvmInfo() {
       RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
       String vendor = mxbean.getVmVendor();
       System.out.println("jvm name:" + mxbean.getVmName());
       System.out.println("jvm version:" + mxbean.getVmVersion());
       System.out.println("jvm bootClassPath:" + mxbean.getBootClassPath());
       System.out.println("jvm start time:" + mxbean.getStartTime());
   }

   /**
    * Java 虚拟机的内存系统
    */

   public static void showMemoryInfo() {
       MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
       MemoryUsage heap = mem.getHeapMemoryUsage();
       System.out.println("Heap committed:" + heap.getCommitted() + " init:" + heap.getInit() + " max:"
               + heap.getMax() + " used:" + heap.getUsed());
   }

   /**
    * Java 虚拟机在其上运行的操作系统
    */

   public static void showSystem() {
       OperatingSystemMXBean op = ManagementFactory.getOperatingSystemMXBean();
       System.out.println("Architecture: " + op.getArch());
       System.out.println("Processors: " + op.getAvailableProcessors());
       System.out.println("System name: " + op.getName());
       System.out.println("System version: " + op.getVersion());
       System.out.println("Last minute load: " + op.getSystemLoadAverage());
   }

   /**
    * Java 虚拟机的类加载系统
    */

   public static void showClassLoading(){
       ClassLoadingMXBean cl = ManagementFactory.getClassLoadingMXBean();
       System.out.println("TotalLoadedClassCount: " + cl.getTotalLoadedClassCount());
       System.out.println("LoadedClassCount" + cl.getLoadedClassCount());
       System.out.println("UnloadedClassCount:" + cl.getUnloadedClassCount());
   }

   /**
    * Java 虚拟机的编译系统
    */

   public static void showCompilation(){
       CompilationMXBean com = ManagementFactory.getCompilationMXBean();
       System.out.println("TotalCompilationTime:" + com.getTotalCompilationTime());
       System.out.println("name:" + com.getName());
   }

   /**
    * Java 虚拟机的线程系统
    */

   public static void showThread(){
       ThreadMXBean thread = ManagementFactory.getThreadMXBean();
       System.out.println("ThreadCount" + thread.getThreadCount());
       System.out.println("AllThreadIds:" + thread.getAllThreadIds());
       System.out.println("CurrentThreadUserTime" + thread.getCurrentThreadUserTime());
       //......还有其他很多信息
   }

   /**
    * Java 虚拟机中的垃圾回收器。
    */

   public static void showGarbageCollector(){
       List<GarbageCollectorMXBean> gc = ManagementFactory.getGarbageCollectorMXBeans();
       HashSet younggcAlgorithm = new HashSet() {
           {
               this.add("Copy");
               this.add("ParNew");
               this.add("PS Scavenge");
           }
       };
       HashSet oldgcAlgorithm = new HashSet() {
           {
               this.add("MarkSweepCompact");
               this.add("PS MarkSweep");
               this.add("ConcurrentMarkSweep");
           }
       };
       for(GarbageCollectorMXBean GarbageCollectorMXBean : gc){
           String gcAlgorithm = GarbageCollectorMXBean.getName();
           System.out.println("name:" + gcAlgorithm);
           System.out.println("CollectionCount:" + GarbageCollectorMXBean.getCollectionCount());
           System.out.println("CollectionTime" + GarbageCollectorMXBean.getCollectionTime());
           if(younggcAlgorithm.contains(gcAlgorithm)) {
               System.out.println("YoungGCCount:" + GarbageCollectorMXBean.getCollectionCount());
               System.out.println("YoungGCTime" + GarbageCollectorMXBean.getCollectionTime());
           } else if(oldgcAlgorithm.contains(gcAlgorithm)) {
               System.out.println("FullGCCount:" + GarbageCollectorMXBean.getCollectionCount());
               System.out.println("FullGCTime" + GarbageCollectorMXBean.getCollectionTime());
           }
       }
   }

   /**
    * Java 虚拟机中的内存管理器
    */

   public static void showMemoryManager(){
       List<MemoryManagerMXBean> mm = ManagementFactory.getMemoryManagerMXBeans();
       for(MemoryManagerMXBean eachmm: mm){
           System.out.println("name:" + eachmm.getName());
           System.out.println("MemoryPoolNames:" + eachmm.getMemoryPoolNames().toString());
       }
   }

   /**
    * Java 虚拟机中的内存池
    */

   public static void showMemoryPool(){
       List<MemoryPoolMXBean> mps = ManagementFactory.getMemoryPoolMXBeans();
       for(MemoryPoolMXBean mp : mps){
           System.out.println("name:" + mp.getName());
           System.out.println("CollectionUsage:" + mp.getCollectionUsage());
           System.out.println("type:" + mp.getType());
       }
   }

   /**
    * 访问 MXBean 的方法的三种方法
    */

   public static void visitMBean(){

       // 第一种直接调用同一 Java 虚拟机内的 MXBean 中的方法。
       RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
       String vendor1 = mxbean.getVmVendor();
       System.out.println("vendor1:" + vendor1);

       /* 第二种通过一个连接到正在运行的虚拟机的平台 MBeanServer 的 MBeanServerConnection。
       MBeanServerConnection mbs = null;
       // Connect to a running JVM (or itself) and get MBeanServerConnection
       // that has the JVM MXBeans registered in it

       try {
           // Assuming the RuntimeMXBean has been registered in mbs
           ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);
           String vendor2 = (String) mbs.getAttribute(oname, "VmVendor");
           System.out.println("vendor2:" + vendor2);
       } catch (Exception e) {
           e.printStackTrace();
       }
       */


       /* 第三种使用 MXBean 代理
       MBeanServerConnection mbs3 = null;
       RuntimeMXBean proxy;
       try {
           proxy = ManagementFactory.newPlatformMXBeanProxy(mbs3,ManagementFactory.RUNTIME_MXBEAN_NAME,
                                                    RuntimeMXBean.class);
           String vendor = proxy.getVmVendor();
       } catch (IOException e) {
           e.printStackTrace();
       }
       */

   }
}

4. 获取内存大小

下面的类实现了 jvm 内存各项指标的获取:

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Iterator;
import java.util.Locale;
import javax.management.MBeanServer;

public class MemoryInformations {
   private static final String NEXT = ",\n";
   private static final String MO = " Mo";
   private final long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
   private final long maxMemory = Runtime.getRuntime().maxMemory();
   private final long usedOldGen;
   private final long maxOldGen;
   private final long usedPermGen;
   private final long maxPermGen;
   private final long usedEdenSpace;
   private final long maxEdenSpace;
   private final long usedSurvivorSpace;
   private final long maxSurvivorSpace;
   private final long usedNonHeapMemory;
   private final long maxNonHeapMemory;
   private final int loadedClassesCount;
   private final long garbageCollectionTimeMillis;
   private final long usedPhysicalMemorySize;
   private final long usedSwapSpaceSize;
   private final String memoryDetails;
   private static MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();

   MemoryInformations() {
       MemoryPoolMXBean permGenMemoryPool = getPermGenMemoryPool();
       if(permGenMemoryPool != null) {
           MemoryUsage oldGenMemoryPool = permGenMemoryPool.getUsage();
           this.usedPermGen = oldGenMemoryPool.getUsed();
           this.maxPermGen = oldGenMemoryPool.getMax();
       } else {
           this.usedPermGen = 0L;
           this.maxPermGen = 0L;
       }

       MemoryPoolMXBean oldGenMemoryPool1 = getOldGenMemoryPool();
       if(oldGenMemoryPool1 != null) {
           MemoryUsage edenSpaceMemoryPool = oldGenMemoryPool1.getUsage();
           this.usedOldGen = edenSpaceMemoryPool.getUsed();
           this.maxOldGen = edenSpaceMemoryPool.getMax();
       } else {
           this.usedOldGen = 0L;
           this.maxOldGen = 0L;
       }

       MemoryPoolMXBean edenSpaceMemoryPool1 = getEdenSpacePool();
       if(edenSpaceMemoryPool1 != null) {
           MemoryUsage survivorSpacePool = edenSpaceMemoryPool1.getUsage();
           this.usedEdenSpace = survivorSpacePool.getUsed();
           this.maxEdenSpace = survivorSpacePool.getMax();
       } else {
           this.usedEdenSpace = 0L;
           this.maxEdenSpace = 0L;
       }

       MemoryPoolMXBean survivorSpacePool1 = getSurvivorSpaceMemoryPool();
       if(survivorSpacePool1 != null) {
           MemoryUsage operatingSystem = survivorSpacePool1.getUsage();
           this.usedSurvivorSpace = operatingSystem.getUsed();
           this.maxSurvivorSpace = operatingSystem.getMax();
       } else {
           this.usedSurvivorSpace = 0L;
           this.maxSurvivorSpace = 0L;
       }

       this.usedNonHeapMemory = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getUsed();
       this.maxNonHeapMemory = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getMax();
       this.loadedClassesCount = ManagementFactory.getClassLoadingMXBean().getLoadedClassCount();
       this.garbageCollectionTimeMillis = buildGarbageCollectionTimeMillis();
       OperatingSystemMXBean operatingSystem1 = ManagementFactory.getOperatingSystemMXBean();
       if(isSunOsMBean(operatingSystem1)) {
           com.sun.management.OperatingSystemMXBean osBean = (com.sun.management.OperatingSystemMXBean)operatingSystem1;
           this.usedPhysicalMemorySize = osBean.getTotalPhysicalMemorySize() - osBean.getFreePhysicalMemorySize();
           this.usedSwapSpaceSize = osBean.getTotalSwapSpaceSize() - osBean.getFreeSwapSpaceSize();
       } else {
           this.usedPhysicalMemorySize = 0L;
           this.usedSwapSpaceSize = 0L;
       }

       this.memoryDetails = this.buildMemoryDetails();
   }

   private static MemoryPoolMXBean getPermGenMemoryPool() {
       Iterator var0 = ManagementFactory.getMemoryPoolMXBeans().iterator();

       MemoryPoolMXBean memoryPool;
       do {
           if(!var0.hasNext()) {
               return null;
           }

           memoryPool = (MemoryPoolMXBean)var0.next();
       } while(!memoryPool.getName().endsWith("Perm Gen"));

       return memoryPool;
   }

   private static MemoryPoolMXBean getOldGenMemoryPool() {
       Iterator var0 = ManagementFactory.getMemoryPoolMXBeans().iterator();

       MemoryPoolMXBean memoryPool;
       do {
           if(!var0.hasNext()) {
               return null;
           }

           memoryPool = (MemoryPoolMXBean)var0.next();
       } while(!memoryPool.getName().endsWith("Old Gen"));

       return memoryPool;
   }

   private static MemoryPoolMXBean getEdenSpacePool() {
       Iterator var0 = ManagementFactory.getMemoryPoolMXBeans().iterator();

       MemoryPoolMXBean memoryPool;
       do {
           if(!var0.hasNext()) {
               return null;
           }

           memoryPool = (MemoryPoolMXBean)var0.next();
       } while(!memoryPool.getName().endsWith("Eden Space"));

       return memoryPool;
   }

   private static MemoryPoolMXBean getSurvivorSpaceMemoryPool() {
       Iterator var0 = ManagementFactory.getMemoryPoolMXBeans().iterator();

       MemoryPoolMXBean memoryPool;
       do {
           if(!var0.hasNext()) {
               return null;
           }

           memoryPool = (MemoryPoolMXBean)var0.next();
       } while(!memoryPool.getName().endsWith("Survivor Space"));

       return memoryPool;
   }

   private static long buildGarbageCollectionTimeMillis() {
       long garbageCollectionTime = 0L;

       GarbageCollectorMXBean garbageCollector;
       for(Iterator var2 = ManagementFactory.getGarbageCollectorMXBeans().iterator(); var2.hasNext(); garbageCollectionTime += garbageCollector.getCollectionTime()) {
           garbageCollector = (GarbageCollectorMXBean)var2.next();
       }

       return garbageCollectionTime;
   }

   private String buildMemoryDetails() {
       DecimalFormat integerFormat = new DecimalFormat("

使用 java.lang.management 包监控 java 虚拟机》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:https://www.bookhoes.com/4407.html