我想在 Java 中监控以下系统信息:
- 当前 CPU 使用率**(百分比)
- 可用内存*(可用/总计)
可用磁盘空间(可用/总)
*请注意,我指的是整个系统可用的总内存,而不仅仅是 JVM。
我正在寻找一种不依赖我自己的代码调用外部程序或使用 JNI 的跨平台解决方案(Linux、Mac 和 Windows)。尽管这些都是可行的选择,但如果有人已经有了更好的解决方案,我不希望自己维护特定于操作系统的代码。
如果有一个免费的库以可靠的跨平台方式执行此操作,那就太好了(即使它进行外部调用或使用本机代码本身)。
任何建议都非常感谢。
为了澄清,我想获得整个系统的当前 CPU 使用率,而不仅仅是 Java 进程。
SIGAR API 在一个包中提供了我正在寻找的所有功能,因此它是迄今为止我问题的最佳答案。但是,由于它是在 GPL 下获得许可的,我不能将它用于我的原始目的(封闭源代码的商业产品)。Hyperic 可能会许可 SIGAR 用于商业用途,但我没有调查过。对于我的 GPL 项目,我以后肯定会考虑 SIGAR。
对于我目前的需求,我倾向于以下内容:
- 对于 CPU 使用率,
OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
(每个 cpu 的平均负载) - 为了记忆,
OperatingSystemMXBean.getTotalPhysicalMemorySize()
和OperatingSystemMXBean.getFreePhysicalMemorySize()
- 对于磁盘空间,
File.getTotalSpace()
以及File.getUsableSpace()
限制:
和getSystemLoadAverage()
磁盘空间查询方法仅在 Java 6 下可用。此外,某些 JMX 功能可能不适用于所有平台(即据报道getSystemLoadAverage()
在 Windows 上返回 -1)。
虽然最初是在 GPL 下许可的,但它已更改为Apache 2.0,它通常可用于封闭源代码的商业产品。