JVM Management API

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定义了解其主要功能

Java代码  

  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. }

[java] view plain copy

  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定义了解其提供的主要功能

Java代码  

  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. }

[java] view plain copy

  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定义了解其提供的主要功能

Java代码  

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

[java] view plain copy

  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定义了解其提供的主要功能

Java代码  

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

[java] view plain copy

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

java.lang.management.MemoryManagerMXBean定义是

Java代码  

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

[java] view plain copy

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

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

Java代码  

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

[java] view plain copy

  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了解其主要提供的功能

Java代码  

  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] view plain copy

  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我们可以通过下图来了解其提供的主要信息

Java代码  

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

[java] view plain copy

  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了解其主要提供的功能

Java代码  

  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. }

[java] view plain copy

  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定义我们可以了解到其主要提供的功能

Java代码  

  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. }

[java] view plain copy

  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了解一些额外可以获取到的信息

Java代码  

  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. }

[java] view plain copy

  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可以了解其主要提供的功能

Java代码  

  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. }

[java] view plain copy

  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了解其提供的主要功能

Java代码  

  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. }

[java] view plain copy

  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

Java代码  

  1. MBeanServer server = ManagementFactory.getPlatformMBeanServer();
  2. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(server,
  3. "java.lang:type=Runtime", RuntimeMXBean.class);

[java] view plain copy

  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)连接到代理上

Java代码  

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

[java] view plain copy

  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包)

Java代码  

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

[java] view plain copy

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

}

[java] view plain copy

  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("[email protected]@@~~"+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. }
时间: 2024-12-07 06:42:48

JVM Management API的相关文章

Jboss EAP:native management API学习

上一节已经学习了CLI命令行来控制JBOSS,如果想在程序中以编码方式来控制JBOSS,可以参考下面的代码,实际上在前面的文章,用代码控制Jboss上的DataSource,已经有所接触了,API与CLI是完全等价的,一个是人工敲指令,一个是代码控制,二者最终的效果一致. import com.sun.javafx.sg.PGShape; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.a

RabbitMQ Management API调用

RabbitMQ在运行时,偶尔会有一些死信,即消息未正常消费,造成消息积压在消息队列中, 一直卡住,重复循环消费原来的消息队列 那么就需要有一种机制,来查看RabbitMQ是否有消息未正常消费,从而让RabbitMQ消费端重新启动服务,让消息能顺利消费(例如让Windows Service重启等) 首先,查看RabbitMQ Manage的界面,可以看到,这里未应答的消息总数是0,在某些特定的情况下,有可能会出现未应答的消息的,所以需要进行检测 RabbitMQ Management API文档

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

通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Management REST API 什么是Azure Service Management REST API Azure Service Management REST API(之后简称为Azure REST API)是微软开放的一组REST API,它使得Azure用户不仅可以从Azure门户网站上对运

JVM Monitoring: JMX or SNMP?

JVM Monitoring: JMX or SNMP? By daniel on Feb 23, 2007 Since JavaTM SE 5.0, the JRE provides a means to manage and monitor the Java Virtual Machine. It comes in two flavors: one is based on the Java Management Extension (JMXTM), the other is a small

Java Attach API

catalog 1. instrucment与Attach API 2. BTrace: VM Attach的两种方式 3. Sun JVM Attach API 1. instrucment与Attach API JDK5中增加了一个包java.lang.instrucment,能够对JVM底层组件进行访问.在JDK 5中,Instrument 要求在运行前利用命令行参数或者系统参数来设置代理类,在实际的运行之中,虚拟机在初始化之时(在绝大多数的 Java 类库被载入之前),instrumen

JVM 监控工具——jconsole

[官方文档]:Using JConsole 1. 简介 JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行.您可以轻松地使用JConsole(或者,它更高端的“近亲” VisualVM)来监控Java应用程序性能和跟踪Java中的代码. JConsole 工具以 java.lang.management API 为基础进行构建.JConsole 将连接到运行在同一个工作站或远程工作站上的应用程序.这些应用程序必须配置为允许访问. JConsole 连接到 Ja

BSD socket API

伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用编程接口已经是网络套接字的抽象标准.大多数其他程序语言使用一种相似的编程接口.它最初是由加州伯克利大学为Unix系统开发出来的.所有现代的操作系统都实现了伯克利套接字接口,因为它已经是连接互联网的标准接口了. API函数 这些是伯克利套接字提供的库函数. socket() 创造某种类型的套接字,分配

文件系统API的基本概念

文件系统API(File System API)模拟网络应用程序可以导航到的本地文件系统.你可以开发应用在一个沙盒的虚拟文件系统中读.写.创建以及索引文件. 该文件系统API与其他相关的API交互.它基于文件写入API(File Writer API),而后者又基于文件API(File API).每一个API都具有不同的功能.这些API对于网络应用而言是一个巨大的进化飞跃,使得它们能够缓存和处理大量级的数据. 关于这篇文档EDIT 这篇介绍讨论了文件系统API中的基本概念和术语.它将给出一个大致

WebChromeClient 简介 API 案例

代码位置:https://github.com/baiqiantao/WebViewTest.git 设计思想理解 在WebView的设计中,不是什么事都要WebView类干的,有相当多的杂事是分给其他类做的,这样WebView专心干好自己的解析.渲染工作就行了.比如我们最熟知的,所有针对WebView的设置都封装到了WebSettings里.我们知道,在使用WebView加载资源过程中,可能会有大量各种类型事件的回调,为了方便开发组处理这些回调,针对不同的事件回调,google将这些回调进行了