JVM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据、JVM当前所有线程及其栈相关信 息等等。各种JDK自带的剖析工具,包括jps、jstack、jinfo、jstat、jmap、jconsole等,都是基于此API开发的。本篇对 这部分内容进行一个详细的说明。

参考:http://java.sun.com/javase/6/docs/api/java/lang/management/package-summary.html
一、Management API
       我们先看一下从Sun JVM我们可以获取到哪些信息,如下图(来自于JConsole的MBean部分的截图):
      
      1.HotSpotDiagnostic:非标准的监控JMX,这块是Sun JVM自带的,主要提供了两个功能

  • 修改JVM的启动参数(譬如在不需要重启的情况下设置-XX:+HeapDumpOnOutOfMemoryError参数使得JVM内存不足的时候自动dump出堆空间到文件提供后续分析)
  • Dump堆信息到文件,可以猜测jmap工具是基于此功能来完成的

我们通过com.sun.management.HotSpotDiagnosticMXBean定义了解其主要功能

  1. public interface HotSpotDiagnosticMXBean
  2. {
  3. void dumpHeap(String s, boolean flag) throws IOException;
  4. List getDiagnosticOptions();
  5. VMOption getVMOption(String s);
  6. void setVMOption(String s, String s1);
  7. }
  1. public interface HotSpotDiagnosticMXBean
  2. {
  3. void dumpHeap(String s, boolean flag) throws IOException;
  4. List getDiagnosticOptions();
  5. VMOption getVMOption(String s);
  6. void setVMOption(String s, String s1);
  7. }

2.ClassLoading:加载的类的总体信息,我们可以通过此MBean获取到JVM加载的类定义的总体信息,可以猜测JConsole的类功能就
是通过此MBean来提供的。我们可以通过java.lang.management.ClassLoadingMXBean定义了解其提供的主要功能

  1. public interface ClassLoadingMXBean {
  2. public long getTotalLoadedClassCount();
  3. public int getLoadedClassCount();
  4. public long getUnloadedClassCount();
  5. public boolean isVerbose();
  6. public void setVerbose(boolean value);
  7. }
  1. public interface ClassLoadingMXBean {
  2. public long getTotalLoadedClassCount();
  3. public int getLoadedClassCount();
  4. public long getUnloadedClassCount();
  5. public boolean isVerbose();
  6. public void setVerbose(boolean value);
  7. }

3.Compilation:提供JVM的JIT(Just In Time)编译器(将bytecode编译成native
code)的信息,我们可以通过java.lang.management.CompilationMXBean定义了解其提供的主要功能

  1. public interface CompilationMXBean {
  2. public java.lang.String    getName();
  3. public boolean isCompilationTimeMonitoringSupported();
  4. public long                getTotalCompilationTime();
  5. }
  1. public interface CompilationMXBean {
  2. public java.lang.String    getName();
  3. public boolean isCompilationTimeMonitoringSupported();
  4. public long                getTotalCompilationTime();
  5. }

4.GarbageCollector:垃圾回收器信息,譬如在如上图中,我们启动的JVM会包含一个Copy垃圾回收器(用于Young
Gen垃圾回收)和一个MarkAndSweep垃圾回收器(用于Tenured
Gen垃圾回收)。我们可以通过java.lang.management.GarbageCollectorMXBean定义了解其提供的主要功能

  1. public interface GarbageCollectorMXBean extends MemoryManagerMXBean {
  2. public long getCollectionCount();
  3. public long getCollectionTime();
  4. }
  1. public interface GarbageCollectorMXBean extends MemoryManagerMXBean {
  2. public long getCollectionCount();
  3. public long getCollectionTime();
  4. }

java.lang.management.MemoryManagerMXBean定义是

  1. public interface MemoryManagerMXBean {
  2. public String getName();
  3. public boolean isValid();
  4. public String[] getMemoryPoolNames();
  5. }
  1. public interface MemoryManagerMXBean {
  2. public String getName();
  3. public boolean isValid();
  4. public String[] getMemoryPoolNames();
  5. }

除了如上信息,Sun JVM在实现上还提供了一个额外的信息LastGCInfo,见com.sun.management.GarbageCollectorMXBean定义

  1. public interface GarbageCollectorMXBean
  2. extends java.lang.management.GarbageCollectorMXBean
  3. {
  4. GcInfo getLastGcInfo();
  5. }
  1. public interface GarbageCollectorMXBean
  2. extends java.lang.management.GarbageCollectorMXBean
  3. {
  4. GcInfo getLastGcInfo();
  5. }

我们可以通过下面的截图了解GcInfo包含的主要信息
   
      其中java.lang.management.MemoryUsage后续可以看说明
      5.内存相关
      可以猜测,JConsole的内存部分的功能都是通过此部分的相关Bean来完成的。
     
1)Memory/MemoryManager:内存块相关信息,通过这MBean我们可以获取到内存的总体信息,并可以通过提供的gc操作进行强制gc
的功能(System.gc())。我们可以通过java.lang.management.MemoryMXBean和
java.lang.management.MemoryManagerMXBean了解其主要提供的功能

  1. public interface MemoryMXBean {
  2. public int getObjectPendingFinalizationCount();
  3. public MemoryUsage getHeapMemoryUsage();
  4. public MemoryUsage getNonHeapMemoryUsage();
  5. public boolean isVerbose();
  6. public void setVerbose(boolean value);
  7. public void gc();
  8. }
  1. public interface MemoryMXBean {
  2. public int getObjectPendingFinalizationCount();
  3. public MemoryUsage getHeapMemoryUsage();
  4. public MemoryUsage getNonHeapMemoryUsage();
  5. public boolean isVerbose();
  6. public void setVerbose(boolean value);
  7. public void gc();
  8. }

其中java.lang.management.MemoryUsage我们可以通过下图来了解其提供的主要信息

  1. public interface MemoryManagerMXBean {
  2. public String getName();
  3. public boolean isValid();
  4. public String[] getMemoryPoolNames();
  5. }
  1. public interface MemoryManagerMXBean {
  2. public String getName();
  3. public boolean isValid();
  4. public String[] getMemoryPoolNames();
  5. }

2)MemoryPool:通过该MBean可以了解JVM各内存块的信息,譬如对于Sun JVM,目前包括Eden
Space、Suvivor Space、Tenured Gen、CodeCache、Perm
Gen,可以猜测JConsole的内存监控功能就是通过此MBean来做到的。我们可以通过
java.lang.management.MemoryPoolMXBean了解其主要提供的功能

  1. public interface MemoryPoolMXBean {
  2. public String getName();
  3. public MemoryType getType();
  4. public MemoryUsage getUsage();
  5. public MemoryUsage getPeakUsage();
  6. public void resetPeakUsage();
  7. public boolean isValid();
  8. public String[] getMemoryManagerNames();
  9. public long getUsageThreshold();
  10. public void setUsageThreshold(long threshold);
  11. public boolean isUsageThresholdExceeded();
  12. public long getUsageThresholdCount();
  13. public boolean isUsageThresholdSupported();
  14. public long getCollectionUsageThreshold();
  15. public void setCollectionUsageThreshold(long threhsold);
  16. public boolean isCollectionUsageThresholdExceeded();
  17. public long getCollectionUsageThresholdCount();
  18. public MemoryUsage getCollectionUsage();
  19. public boolean isCollectionUsageThresholdSupported();
  20. }
  1. public interface MemoryPoolMXBean {
  2. public String getName();
  3. public MemoryType getType();
  4. public MemoryUsage getUsage();
  5. public MemoryUsage getPeakUsage();
  6. public void resetPeakUsage();
  7. public boolean isValid();
  8. public String[] getMemoryManagerNames();
  9. public long getUsageThreshold();
  10. public void setUsageThreshold(long threshold);
  11. public boolean isUsageThresholdExceeded();
  12. public long getUsageThresholdCount();
  13. public boolean isUsageThresholdSupported();
  14. public long getCollectionUsageThreshold();
  15. public void setCollectionUsageThreshold(long threhsold);
  16. public boolean isCollectionUsageThresholdExceeded();
  17. public long getCollectionUsageThresholdCount();
  18. public MemoryUsage getCollectionUsage();
  19. public boolean isCollectionUsageThresholdSupported();
  20. }

6.系统运行信息
     1)OperatingSystem:通过该MBean我们可以了解到JVM所运行在的操作系统上的一些相关信息,通过java.lang.management.OperatingSystemMXBean定义我们可以了解到其主要提供的功能

  1. public interface OperatingSystemMXBean {
  2. public String getName();
  3. public String getArch();
  4. public String getVersion();
  5. public int getAvailableProcessors();
  6. public double getSystemLoadAverage();
  7. }
  1. public interface OperatingSystemMXBean {
  2. public String getName();
  3. public String getArch();
  4. public String getVersion();
  5. public int getAvailableProcessors();
  6. public double getSystemLoadAverage();
  7. }

SunJVM在此基础上提供更多的一些信息,可以通过com.sun.management.OperatingSystemMXBean了解一些额外可以获取到的信息

  1. public interface OperatingSystemMXBean
  2. extends java.lang.management.OperatingSystemMXBean
  3. {
  4. long getCommittedVirtualMemorySize();
  5. long getTotalSwapSpaceSize();
  6. long getFreeSwapSpaceSize();
  7. long getProcessCpuTime();
  8. long getFreePhysicalMemorySize();
  9. long getTotalPhysicalMemorySize();
  10. }
  1. public interface OperatingSystemMXBean
  2. extends java.lang.management.OperatingSystemMXBean
  3. {
  4. long getCommittedVirtualMemorySize();
  5. long getTotalSwapSpaceSize();
  6. long getFreeSwapSpaceSize();
  7. long getProcessCpuTime();
  8. long getFreePhysicalMemorySize();
  9. long getTotalPhysicalMemorySize();
  10. }

2)Runtime:通过该MBean获取获取到JVM一些相关的信息,通过java.lang.management.RuntimeMXBean可以了解其主要提供的功能

  1. public interface RuntimeMXBean {
  2. public String getName();
  3. public String getVmName();
  4. public String getVmVendor();
  5. public String getVmVersion();
  6. public String getSpecName();
  7. public String getSpecVendor();
  8. public String getSpecVersion();
  9. public String getManagementSpecVersion();
  10. public String getClassPath();
  11. public String getLibraryPath();
  12. public boolean isBootClassPathSupported();
  13. public String getBootClassPath();
  14. public java.util.List<String> getInputArguments();
  15. public long getUptime();
  16. public long getStartTime();
  17. public java.util.Map<String, String> getSystemProperties();
  18. }
  1. public interface RuntimeMXBean {
  2. public String getName();
  3. public String getVmName();
  4. public String getVmVendor();
  5. public String getVmVersion();
  6. public String getSpecName();
  7. public String getSpecVendor();
  8. public String getSpecVersion();
  9. public String getManagementSpecVersion();
  10. public String getClassPath();
  11. public String getLibraryPath();
  12. public boolean isBootClassPathSupported();
  13. public String getBootClassPath();
  14. public java.util.List<String> getInputArguments();
  15. public long getUptime();
  16. public long getStartTime();
  17. public java.util.Map<String, String> getSystemProperties();
  18. }

可以通过RuntimeMXBean.getUptime()和OperatingSystemMXBean. getProcessCpuTime()来计算JVM占用的系统CPU比例的情况,JConsole的CPU视图就是通过这种方式计算的。
      7.Threading:可以通过该MBean获取线程信息,包括线程状态、执行栈等。可以通过java.lang.management.ThreadMXBean了解其提供的主要功能

  1. public interface ThreadMXBean {
  2. public int getThreadCount();
  3. public int getPeakThreadCount();
  4. public long getTotalStartedThreadCount();
  5. public int getDaemonThreadCount();
  6. public long[] getAllThreadIds();
  7. public ThreadInfo getThreadInfo(long id);
  8. public ThreadInfo[] getThreadInfo(long[] ids);
  9. public ThreadInfo getThreadInfo(long id, int maxDepth);
  10. public ThreadInfo[] getThreadInfo(long[] ids, int maxDepth);
  11. public boolean isThreadContentionMonitoringSupported();
  12. public boolean isThreadContentionMonitoringEnabled();
  13. public void setThreadContentionMonitoringEnabled(boolean enable);
  14. public long getCurrentThreadCpuTime();
  15. public long getCurrentThreadUserTime();
  16. public long getThreadCpuTime(long id);
  17. public long getThreadUserTime(long id);
  18. public boolean isThreadCpuTimeSupported();
  19. public boolean isCurrentThreadCpuTimeSupported();
  20. public boolean isThreadCpuTimeEnabled();
  21. public void setThreadCpuTimeEnabled(boolean enable);
  22. public long[] findMonitorDeadlockedThreads();
  23. public void resetPeakThreadCount();
  24. public long[] findDeadlockedThreads();
  25. public boolean isObjectMonitorUsageSupported();
  26. public boolean isSynchronizerUsageSupported();
  27. public ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers);
  28. public ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers);
  29. }
  1. public interface ThreadMXBean {
  2. public int getThreadCount();
  3. public int getPeakThreadCount();
  4. public long getTotalStartedThreadCount();
  5. public int getDaemonThreadCount();
  6. public long[] getAllThreadIds();
  7. public ThreadInfo getThreadInfo(long id);
  8. public ThreadInfo[] getThreadInfo(long[] ids);
  9. public ThreadInfo getThreadInfo(long id, int maxDepth);
  10. public ThreadInfo[] getThreadInfo(long[] ids, int maxDepth);
  11. public boolean isThreadContentionMonitoringSupported();
  12. public boolean isThreadContentionMonitoringEnabled();
  13. public void setThreadContentionMonitoringEnabled(boolean enable);
  14. public long getCurrentThreadCpuTime();
  15. public long getCurrentThreadUserTime();
  16. public long getThreadCpuTime(long id);
  17. public long getThreadUserTime(long id);
  18. public boolean isThreadCpuTimeSupported();
  19. public boolean isCurrentThreadCpuTimeSupported();
  20. public boolean isThreadCpuTimeEnabled();
  21. public void setThreadCpuTimeEnabled(boolean enable);
  22. public long[] findMonitorDeadlockedThreads();
  23. public void resetPeakThreadCount();
  24. public long[] findDeadlockedThreads();
  25. public boolean isObjectMonitorUsageSupported();
  26. public boolean isSynchronizerUsageSupported();
  27. public ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers);
  28. public ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers);
  29. }

二、编程获取到JVM Manage信息
我们可以通过JMX的方式读取到JVM Manage定义的MBean,如下是3种获取方法
     1.监控应用与被监控应用位于同一JVM

  1. MBeanServer server = ManagementFactory.getPlatformMBeanServer();
  2. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(server,
  3. "java.lang:type=Runtime", RuntimeMXBean.class);
  1. MBeanServer server = <span style="BACKGROUND-COLOR: #00ff40; COLOR: black; " id="casearchresult"><strong>ManagementFactory</strong></span>.getPlatformMBeanServer();
  2. RuntimeMXBean rmxb = <span style="BACKGROUND-COLOR: #00ff40; COLOR: black; " id="casearchresult"><strong>ManagementFactory</strong></span>.newPlatformMXBeanProxy(server,
  3. "java.lang:type=Runtime", RuntimeMXBean.class);

2.监控应用与被监控应用不位于同一JVM
      1)首先在被监控的JVM的启动参数中加入如下的启动参数以启JVM代理

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=127.0.0.1:8000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

2)连接到代理上

  1. JMXServiceURL url = new JMXServiceURL(
  2. "service:jmx:rmi:///jndi/rmi://127.0.0.1:8000/jmxrmi");
  3. JMXConnector connector = JMXConnectorFactory.connect(url);
  4. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector
  5. .getMBeanServerConnection(),"java.lang:type=Runtime",
  6. RuntimeMXBean.class);
  1. JMXServiceURL url = new JMXServiceURL(
  2. "service:jmx:rmi:///jndi/rmi://127.0.0.1:8000/jmxrmi");
  3. JMXConnector connector = JMXConnectorFactory.connect(url);
  4. RuntimeMXBean rmxb = <span style="BACKGROUND-COLOR: #00ff40; COLOR: black; " id="casearchresult"><strong>ManagementFactory</strong></span>.newPlatformMXBeanProxy(connector
  5. .getMBeanServerConnection(),"java.lang:type=Runtime",
  6. RuntimeMXBean.class);

3.监控应用与被监控应用不位于同一JVM但在同一物理主机上(2的特化情况,通过进程Attach)
      
我们使用JDK工具,如jmap、jstack等的时候,工具所在的JVM当然与被监控的JVM不是同一个,所以不能使用方式1,被监控的JVM一般也不
会在启动参数中增加JMX的支持,所以方式2也没有办法。还好Sun
JVM给我们提供了第3种非标准的方式,就是通过Attach到被监控的JVM进程,并在被监控的JVM中启动一个JMX代理,然后使用该代理通过2的方
式连接到被监控的JVM的JMX上。下面是一个使用范例,由于里面使用到的知识涉及到Java
Instrutment(JVMTI的一个技术的Java实现)和Attach
API,因此此处不做详细解析,在后续看完Java Instrutment和Attach
API自然就会明白。(注意,仅在JDK6+中支持,另外,运行需要jdk的tools.jar包)

  1. //Attach 到5656的JVM进程上,后续Attach API再讲解
  2. VirtualMachine virtualmachine = VirtualMachine.attach("5656");
  3. //让JVM加载jmx Agent,后续讲到Java Instrutment再讲解
  4. String javaHome = virtualmachine.getSystemProperties().getProperty("java.home");
  5. String jmxAgent = javaHome + File.separator + "lib" + File.separator + "management-agent.jar";
  6. virtualmachine.loadAgent(jmxAgent, "com.sun.management.jmxremote");
  7. //获得连接地址
  8. Properties properties = virtualmachine.getAgentProperties();
  9. String address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress");
  10. //Detach
  11. virtualmachine.detach();
  12. JMXServiceURL url = new JMXServiceURL(address);
  13. JMXConnector connector = JMXConnectorFactory.connect(url);
  14. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector
  15. .getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);
  1. //Attach 到5656的JVM进程上,后续Attach API再讲解
  2. VirtualMachine virtualmachine = VirtualMachine.attach("5656");
  3. //让JVM加载jmx Agent,后续讲到Java Instrutment再讲解
  4. String javaHome = virtualmachine.getSystemProperties().getProperty("java.home");
  5. String jmxAgent = javaHome + File.separator + "lib" + File.separator + "management-agent.jar";
  6. virtualmachine.loadAgent(jmxAgent, "com.sun.management.jmxremote");
  7. //获得连接地址
  8. Properties properties = virtualmachine.getAgentProperties();
  9. String address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress");
  10. //Detach
  11. virtualmachine.detach();
  12. JMXServiceURL url = new JMXServiceURL(address);
  13. JMXConnector connector = JMXConnectorFactory.connect(url);
  14. RuntimeMXBean rmxb = <span style="BACKGROUND-COLOR: #00ff40; COLOR: black; " id="casearchresult"><strong>ManagementFactory</strong></span>.newPlatformMXBeanProxy(connector
  15. .getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);

三、结束语
     
可以看到,通过标准的接口,我们已经可以获得运行的JVM很详细的信息,从运行JVM、操作系统,到内存、GC和线程,通过这些标准的接口我们已经可以对
JVM进行功能完善的监控。但是仅此是不够的,这部分接口描述的主要是JVM的总体性的信息,而无法提供更多的细节。在下一部分,我们将使用JPDA来更
深入地了解JVM内部信息更细节的信息,并了解我们如何通过JVM TI实现自动的性能监控

软件包 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。
它同时允许从本地和远程对正在运行的 Java 虚拟机进行监视和管理。

管理接口
ClassLoadingMXBean  Java 虚拟机的类加载系统。
CompilationMXBean  Java 虚拟机的编译系统。
MemoryMXBean  Java 虚拟机的内存系统。
ThreadMXBean  Java 虚拟机的线程系统。
RuntimeMXBean  Java 虚拟机的运行时系统。
OperatingSystemMXBean  Java 虚拟机在其上运行的操作系统。
GarbageCollectorMXBean  Java 虚拟机中的垃圾回收器。
MemoryManagerMXBean  Java 虚拟机中的内存管理器。
MemoryPoolMXBean  Java 虚拟机中的内存池。
示例如下:
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.CompilationMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.ThreadMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.util.List;

public class JVM {
   
    public static void main(String[] args) {
        //Java 虚拟机线程系统的管理接口 ThreadMXBean
        ThreadMXBean th=(ThreadMXBean)ManagementFactory.getThreadMXBean() ;
        System.out.println("活动线程的当前数目"+th.getThreadCount());
        System.out.println("返回活动守护线程的当前数目"+th.getDaemonThreadCount());
        System.out.println("Java 虚拟机启动或峰值重置以来峰值活动线程计数"+th.getPeakThreadCount());
        System.out.println("返回当前线程的总 CPU 时间"+th.getCurrentThreadUserTime());
        System.out.println("当前线程在用户模式中执行的 CPU 时间"+th.getCurrentThreadUserTime());
       
        //Java 虚拟机的运行时系统的管理接口。 RuntimeMXBean
        RuntimeMXBean run=(RuntimeMXBean)ManagementFactory.getRuntimeMXBean();
        System.out.println("正在运行的 Java 虚拟机的名称"+run.getName());
        System.out.println("Java 虚拟机规范名称"+run.getSpecName());
        System.out.println("返回 Java 库路径"+run.getLibraryPath());
        System.out.println("系统类加载器用于搜索类文件的 Java 类路径"+run.getClassPath());
       
        //用于操作系统的管理接口,Java 虚拟机在此操作系统上运行 OperatingSystemMXBean
        OperatingSystemMXBean op=(OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
        System.out.println("返回操作系统的架构"+op.getArch());
        System.out.println("返回操作系统名称"+op.getName());
        System.out.println("返回操作系统的版本"+op.getVersion());
        System.out.println("Java 虚拟机可以使用的处理器数目"+op.getAvailableProcessors());
   
        //内存池的管理接口。内存池表示由 Java 虚拟机管理的内存资源,
        //由一个或多个内存管理器对内存池进行管理 MemoryPoolMXBean
         List<MemoryPoolMXBean> list=ManagementFactory.getMemoryPoolMXBeans();
         for(MemoryPoolMXBean mem:list){
          System.out.println("Java 虚拟机启动以来或自峰值重置以来此内存池的峰值内存使用量"+mem.getPeakUsage());
          System.out.println("返回此内存池的类型"+mem.getType());
          System.out.println("内存使用量超过其阈值的次数"+ mem.getUsage());
         }
         //Java 虚拟机内存系统的管理接口。 MemoryMXBean
         MemoryMXBean mem=(MemoryMXBean)ManagementFactory.getMemoryMXBean();
         System.out.println(" 返回用于对象分配的堆的当前内存使用量"+mem.getHeapMemoryUsage());
         System.out.println("Java 虚拟机使用的非堆内存的当前内存使用量"+mem.getNonHeapMemoryUsage());
         // Java 虚拟机的编译系统的管理接口 CompilationMXBean
         CompilationMXBean com=(CompilationMXBean)ManagementFactory.getCompilationMXBean();
         System.out.println("即时 (JIT) 编译器的名称"+com.getName());
         System.out.println("在编译上花费的累积耗费时间的近似值(毫秒)"+com.getTotalCompilationTime());
         
         //Java 虚拟机的类加载系统的管理接口 ClassLoadingMXBean
         ClassLoadingMXBean cl=(ClassLoadingMXBean)ManagementFactory.getClassLoadingMXBean();
         System.out.println("当前加载到 Java 虚拟机中的类的数量"+cl.getLoadedClassCount());
         System.out.println("Java 虚拟机开始执行到目前已经加载的类的总数"+cl.getTotalLoadedClassCount());
         System.out.println("Java 虚拟机开始执行到目前已经卸载的类的总数"+cl.getUnloadedClassCount());
       
       
    }

}

  1. public class TestExcho {
  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) throws Exception{
  6. MBeanServer server = ManagementFactory.getPlatformMBeanServer();
  7. ObjectName name = new ObjectName("com.demo.mbean:type=Excho");
  8. Echo ei =new Echo();
  9. server.registerMBean(ei,name);
  10. server.invoke(name, "setName", new Object[] { "jack"}, new String[] {"java.lang.String"});
  11. server.invoke(name, "showName", null, null);
  12. String yourName = (String)server.invoke(name, "fetchName", new Object[] { "mimi",10}, new String[] {"java.lang.String","int"});
  13. System.out.println("~~~"+yourName);
  14. CompositeData d =  (CompositeData) server.invoke(name, "fetchConfig", null, null);
  15. String fn = (String)d.get("firstName");
  16. String ln = (String)d.get("lastName");
  17. System.out.println("~@@@~~"+fn+"@@"+ln);
  18. int num = (Integer)server.getAttribute(name, "Num");
  19. System.out.println("~OOOOO~~"+num);
  20. Thread.currentThread().sleep(Integer.MAX_VALUE);
  21. }
  22. }

JVM Management API的更多相关文章

  1. Jboss EAP:native management API学习

    上一节已经学习了CLI命令行来控制JBOSS,如果想在程序中以编码方式来控制JBOSS,可以参考下面的代码,实际上在前面的文章,用代码控制Jboss上的DataSource,已经有所接触了,API与C ...

  2. C#码农的大数据之路 - 使用Azure Management API创建HDInsight集群

    Azure平台提供了几乎全线产品的API,可以使用第三方工具来进行管理.对于.NET更是提供封装好了的库方便使用C#等语言实现Azure的管理. 我们使用创建HDInsight集群为例来介绍使用C#管 ...

  3. Java12新特性 -- JVM 常量 API

    Java 12 中引入 JVM 常量 API,用来更容易地对关键类文件 (key class-file) 和运行时构件(artefact)的名义描述 (nominal description) 进行建 ...

  4. RabbitMQ Management API调用

    RabbitMQ在运行时,偶尔会有一些死信,即消息未正常消费,造成消息积压在消息队列中, 一直卡住,重复循环消费原来的消息队列 那么就需要有一种机制,来查看RabbitMQ是否有消息未正常消费,从而让 ...

  5. Azure Management API 之 利用 Windows Azure Management Libraries 来控制Azure platform

    在此之前,我曾经发过一篇文章讲叙了如何利用Azure power shell team 提供的class library. 而就在这篇文章发布之后不久,我又发现微软发布了一个preview 版本的Wi ...

  6. 通过nginx转发rabbitmq访问手动添加队列的时候报错:Management API returned status code 405

    原因: 正常访问该地址:https://xxx.xxx.com/rabbitmq/ 时能正常跳转,但是 rabbitmq management 的 API url 出现了 %2f 字符,这些字符会在经 ...

  7. Java基础(下)(JVM、API)

    Java基础(下) 第三部分:Java源程序的编辑 我们知道,计算机是不能直接理解源代码中的高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译 ...

  8. 如何通过Azure Service Management REST API管理Azure服务

    通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Manag ...

  9. [Windows Azure] Management REST API Reference

    Management REST API Reference 27 out of 42 rated this helpful - Rate this topic The SQL Database Man ...

随机推荐

  1. 去掉Actionbar下的shadow

    <item name="android:windowContentOverlay">@null</item> http://www.cnblogs.com/ ...

  2. MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)

    场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步.动态场景和副本是场景中特殊的类型,副本在这里想必已经是无 ...

  3. 浅析selenium的PageFactory模式

    前面的文章介绍了selenium的PO模式,见文章:http://www.cnblogs.com/qiaoyeye/p/5220827.html.下面介绍一下PageFactory模式. 1.首先介绍 ...

  4. UVA10048 Audiophobia[Floyd变形]

    UVA - 10048 Audiophobia Consider yourself lucky! Consider yourself lucky to be still breathing and h ...

  5. Python3的decode()与encode()

    python3的decode()与encode() Tags: Python Python3 对于从python2.7过来的人,对python3的感受就是python3对文本以及二进制数据做了比较清晰 ...

  6. iOS Photos.framework框架

    链接: iOS8.0 使用Photos.framework对相册的常用操作 iOS AssetsLibrary和Photos的使用总结: 权限及相册的获取 iOS 开发之照片框架详解 iOS Asse ...

  7. Python-13-堡垒机开发

    今天主要是熟悉堡垒机开发流程.

  8. YII2如何修改默认控制器/方法

    在网上找了非常多的方法,但是都不好使最后自己综合网上所有自己琢磨出来的,见笑了 首先Yii2中在/vendor/yiisoft/yii2/web/Application.php的第28行 public ...

  9. Apache Shiro系列一,概述 —— 初识

    一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...

  10. scala速成记录1

    选择  Learning Scala这本书,两百多页,足够薄. 安装 http://www.scala-lang.org/  下载Binary的版本.bin里边有所有操作系统下运行的可以运行的交互式s ...