检测虚拟机当前的状态总是 Java 开放人员所关心的,也正是因为如此,出现了大量的 profiler 工具来检测当前的虚拟机状态。从 Java SE 5 之后,在 JDK 中,我们有了一些 Java 的虚拟机检测 API,即 java.lang.management
包。 Management 包里面包括了许多 MXBean 的接口类和 LockInfo、MemoryUsage、MonitorInfo 和 ThreadInfo 等类。从名字可以看出,该包提供了虚拟机内存分配、垃圾收集(GC)情况、操作系统层、线程调度和共享锁,甚至编译情况的检测机制。这样一来,Java 的开发人员就可以很简单地为自己做一些轻量级的系统检测,来确定当前程序的各种状态,以便随时调整。
要获得这些信息,我们首先通过 java.lang.management.ManagementFactory
这个工厂类来获得一系列的 MXBean。包括:
-
ClassLoadingMXBean
ClassLoadMXBean 包括一些类的装载信息,比如有多少类已经装载 / 卸载(unloaded),虚拟机类装载的 verbose 选项(即命令行中的 Java – verbose:class 选项)是否打开,还可以帮助用户打开 / 关闭该选项。
-
CompilationMXBean
CompilationMXBean 帮助用户了解当前的编译器和编译情况,该 mxbean 提供的信息不多。
-
GarbageCollectorMXBean
相 对于开放人员对 GC 的关注程度来说,该 mxbean 提供的信息十分有限,仅仅提供了 GC 的次数和 GC 花费总时间的近似值。但是这个包中还提供了三个的内存管理检测类:MemoryManagerMXBean,MemoryMXBean 和 MemoryPoolMXBean。
-
MemoryManagerMXBean
这个类相对简单,提供了内存管理类和内存池(memory pool)的名字信息。
-
MemoryMXBean
这个类提供了整个虚拟机中内存的使用情况,包括 Java 堆(heap)和非 Java 堆所占用的内存,提供当前等待 finalize 的对象数量,它甚至可以做 gc(实际上是调用 System.gc)。
-
MemoryPoolMXBean
该 信息提供了大量的信息。在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含了该内存池的详细信息,如是否可用、当前已使用内存 / 最大使用内存值、以及设置最大内存值等等。
-
MemoryManagerMXBean
-
OperatingSystemMXBean
该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等。
-
RuntimeMXBean
运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等。
-
ThreadMXBean
在 Java 这个多线程的系统中,对线程的监控是相当重要的。ThreadMXBean 就是起到这个作用。ThreadMXBean 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个线程的所有信息。
java.lang.management 和虚拟机的关系
我 们知道,management 和底层虚拟机的关系是非常紧密的。其实,有一些的是直接依靠虚拟机提供的公开 API 实现的,比如 JVMTI;而另外一些则不然,很大一块都是由虚拟机底层提供某些不公开的 API / Native Code 提供的。这样的设计方式,保证了 management 包可以提供足够的信息,并且使这些信息的提供又有足够的效率;也使 management 包和底层的联系非常紧密。
代码示例:
- import java.lang.management.MemoryUsage;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.lang.builder.ToStringBuilder;
- /**
- * @author lisen
- * @date 2013-11-22 上午09:23:30
- */
- public class SystemInfoBean {
- // 加载类的数量
- private int loadClazzCount;
- // 已经加载类的数量
- private long hasloadClazzCount;
- // 尚未加载类的数量
- private long hasUnloadClazzCount;
- // 堆内存信息
- private MemoryUsage heapMemoryUsage;
- // 非堆内存信息
- private MemoryUsage nonHeapMemoryUsage;
- // 操作系统的名称
- private String operateName;
- // 操作系统的进程数
- private int processListCount;
- // 操作系统的架构
- private String archName;
- // 操作系统的版本号码
- private String versionName;
- // 虚拟机的名称
- private String vmName;
- // 虚拟机的版本
- private String vmVersion;
- // 系统的供应商的名称
- private String vmVendor;
- // JVM启动时间
- private Date startTime;
- // 输入参数
- private List<String> arguments;
- // 系统参数
- private Map<String, String> systemProperties;
- //setter and getter...
- }
- import java.lang.management.ClassLoadingMXBean;
- import java.lang.management.ManagementFactory;
- import java.lang.management.MemoryMXBean;
- import java.lang.management.OperatingSystemMXBean;
- import java.lang.management.RuntimeMXBean;
- import java.util.Date;
- /**
- * @author lisen
- * @date 2013-11-22 上午09:27:03
- */
- public class SystemInfoUtils {
- private SystemInfoBean infoBean = null;
- private static class SingletonClassInstance {
- private static final SystemInfoUtils instance = new SystemInfoUtils();
- }
- public static SystemInfoUtils getInstance() {
- return SingletonClassInstance.instance;
- }
- private SystemInfoUtils() {
- infoBean = new SystemInfoBean();
- // 操作系统信息
- OperatingSystemMXBean operateSystemMBean = ManagementFactory
- .getOperatingSystemMXBean();
- String operateName = operateSystemMBean.getName();
- infoBean.setOperateName(operateName);
- int processListCount = operateSystemMBean.getAvailableProcessors();
- infoBean.setProcessListCount(processListCount);
- String archName = operateSystemMBean.getArch();// System.getProperty("os.arch");
- infoBean.setArchName(archName);
- String versionName = operateSystemMBean.getVersion();// System.getProperty("os.version");
- infoBean.setVersionName(versionName);
- // 运行时信息
- RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
- String vmName = runtimeMXBean.getVmName();
- infoBean.setVmName(vmName);
- String vmVersion = runtimeMXBean.getVmVersion();
- // infoBean.setVmVersion(vmVersion);
- infoBean.setVmVersion(System.getProperty("java.version") + " ("
- + vmVersion + ")");
- String vmVendor = runtimeMXBean.getVmVendor();
- infoBean.setVmVendor(vmVendor);
- long startTime = runtimeMXBean.getStartTime();
- infoBean.setStartTime(new Date(startTime));
- infoBean.setArguments(runtimeMXBean.getInputArguments());
- infoBean.setSystemProperties(runtimeMXBean.getSystemProperties());
- }
- public SystemInfoBean getSystemInfo() {
- // 类信息
- ClassLoadingMXBean classLoadMXBean = ManagementFactory
- .getClassLoadingMXBean();
- int loadClazzCount = classLoadMXBean.getLoadedClassCount();
- infoBean.setLoadClazzCount(loadClazzCount);
- long hasloadClazzCount = classLoadMXBean.getTotalLoadedClassCount();
- infoBean.setHasloadClazzCount(hasloadClazzCount);
- long hasUnloadClazzCount = classLoadMXBean.getUnloadedClassCount();
- infoBean.setHasUnloadClazzCount(hasUnloadClazzCount);
- // 内存
- MemoryMXBean memoryUsage = ManagementFactory.getMemoryMXBean();
- infoBean.setHeapMemoryUsage(memoryUsage.getHeapMemoryUsage());
- infoBean.setNonHeapMemoryUsage(memoryUsage.getNonHeapMemoryUsage());
- return infoBean;
- }
- }
相关推荐
基于JMX(Java Management Extensions)的Java虚拟机监视系统提供了一种强大的解决方案。 JMX是一种标准的框架,它允许开发者向应用程序、硬件设备、服务和JVM添加管理功能。JMX的核心概念是MBean(Managed Beans)...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
- **JVisualVM**:提供了一整套性能分析和内存泄漏检测工具,帮助开发者优化代码。 这个中文版的Java 1.6参考文档对于学习和开发具有极大的价值,它详尽地介绍了各个类库的功能、用法及示例,是Java程序员不可或缺...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和...
- **NIO.2**:提供了新的文件系统API,增强了文件操作能力。 - **Swing增强**:UI组件得到了更新,性能提升,用户体验改善。 - **并发编程改进**:加入了`Fork/Join`框架,提高了多线程处理的效率。 - **动态代理...
7. **内存检测API**:在Java环境中,可能使用`java.lang.Runtime`类或者JMX(Java Management Extensions)来获取服务器的内存信息。`Runtime`类提供了获取当前Java虚拟机内存信息的方法,而JMX则提供了更强大的管理...
* Java API for Management(JAM):一个基于Java的管理API,提供了应用程序管理和监控功能。 安全性 Java Platform, Standard Edition提供了多种安全机制,例如: * SSL/TLS加密:提供了安全的数据传输功能。 * ...
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
它为开发者提供了丰富的API,可以用来实现诸如性能分析、内存检测、调试等高级功能。本文将深入探讨JVM TI的核心概念、主要功能以及如何使用它来监控Java执行过程。 一、JVM TI概述 JVM TI是Java虚拟机的一部分,...
2. **NIO.2**:Java New I/O 2(NIO.2)引入了新的文件系统API,提供了异步文件操作,使得文件读写更加高效。`java.nio.file`包包含了大量新类,如`Path`、`Files`和`Paths`,便于进行文件操作和路径处理。 3. **...
NIO.2引入了新的文件系统API,提供异步I/O操作,使得文件读写更加高效,尤其在服务器处理大量并发I/O请求时。新API还支持文件属性查询、文件锁定等功能。 6. **增强的JDBC** JDK1.6增强了JDBC驱动,提供了更好的...