Java程序监控系统关键指标
本文我们讨论如何使用Java核心API监控系统关键指标,如磁盘空间、内存使用率以及线程信息等。
1. 内置 API 介绍
File类用于查询特定磁盘信息,File类是文件或目录的抽象表示。可以利用其根据文件路径获取文件系统一些关键信息且与操作系统无关,对windows或linux上对根分区进行检查。
ManagementFactory 类可以用来分析内存使用情况以及处理器信息。该工厂类可以获取管理bean(MXBeans)关于JVM的相关信息,我们主要用到MemoryMXBean和ThreadMXBean类。
- MemoryMXBean
MemoryMXBean表示JVM的内存系统上管理接口。JVM创建了该接口的单实例,可以调用getMemoryMXBean() 方法获取信息。
- ThreadMXBean
与MemoryMXBean类类似, ThreadMXBean 类是JVM线程系统管理接口。可以调用getThreadMXBean()方法获取相关线程的关键信息。
2. API实现监控
2.1. 磁盘使用率
使用File类获取分区的关键信息,包括总磁盘空间、未分配的磁盘空间以及可用的磁盘空间,可用磁盘空间应该大于或等于未分配的磁盘空间。
下面代码读取windows上的C盘:
File cDrive = new File("C:");
System.out.println(String.format("Total space: %.2f GB", (double)cDrive.getTotalSpace() /1073741824));
System.out.println(String.format("Free space: %.2f GB", (double)cDrive.getFreeSpace() /1073741824));
System.out.println(String.format("Usable space: %.2f GB", (double)cDrive.getUsableSpace() /1073741824));
linux上根目录信息:
File root = new File("/");
System.out.println(String.format("Total space: %.2f GB", (double)root.getTotalSpace() /1073741824));
System.out.println(String.format("Free space: %.2f GB", (double)root.getFreeSpace() /1073741824));
System.out.println(String.format("Usable space: %.2f GB", (double)root.getUsableSpace() /1073741824));
默认情况下上述方法返回值单位是字节。一般需转为Gb使可读性更好。
2.2. 内存使用率
可以使用ManagementFactory工厂类的MemoryMXBean方法获取JVM内存情况。这里主要查询堆内存,当然非堆内存也可以获取。
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
System.out.println(String.format("Initial memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getInit() /1073741824));
System.out.println(String.format("Used heap memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getUsed() /1073741824));
System.out.println(String.format("Max heap memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getMax() /1073741824));
System.out.println(String.format("Committed memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getCommitted() /1073741824));
代码主要返回堆初始内存、已使用内存、最大内存、可用内存。描述如下:
- Initial: OS启动时JVM请求初始化的内存大小
- Used: 当前JVM使用的内存大小
- Max: JVM最大有效内存. 如果达到该限制值会抛 OutOfMemoryException 异常
- Committed: 保证JVM可用内存大小
2.3. CPU使用情况
接下来我们使用ThreadMXBean获得ThreadInfo对象的完整列表,并查询它们以获得关于当前JVM上运行的线程的有用信息。
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
for(Long threadID : threadMXBean.getAllThreadIds()) {
ThreadInfo info = threadMXBean.getThreadInfo(threadID);
System.out.println("Thread name: " + info.getThreadName());
System.out.println("Thread State: " + info.getThreadState());
System.out.println(String.format("CPU time: %s ns", threadMXBean.getThreadCpuTime(threadID)));
}
首先调用getAllThreadIds方法获取当前线程列表。然后对每个线程输出其线程名称和状态,最后输出线程占用CPU时间(以纳秒为单位)。
3. 使用Profiler监控系统
这里需要提醒下,一般无需代码进行监控。Java Profilers密切监控jvm的关键指标并进行实时分析。从Java6开始自带的VisualVM工具功能很强大,其他一些IDE也包括相应插件实现相同功能。
4. 总结
本文我介绍Java api 如何监控系统关键指标,磁盘、内存以及线程使用情况,主要使用File、ManagmentFactory类获取相关信息。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/102759154