如何在Java中监控计算机的CPU、内存和磁盘使用情况?

206
我希望在Java中监视以下系统信息:
  • 当前CPU使用率**(百分比)
  • 可用内存*(空闲/总共)
  • 可用磁盘空间(空闲/总共)

    *注意,我的意思是整个系统可用的内存,而不仅仅是JVM。

我正在寻找一种跨平台解决方案(Linux、Mac和Windows),它不依赖于我自己调用外部程序或使用JNI。尽管这些是可行的选择,但如果有人已经有更好的解决方案,我更愿意不自己维护特定于操作系统的代码。

如果有一个免费的库以可靠且跨平台的方式实现此功能,那就太好了(即使它会调用外部程序或使用本地代码)。

非常感谢任何建议。

要澄清的是,我想获取整个系统的当前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,通常可用于闭源、商业产品。


澄清一下,Sigar API 可以获取系统信息。如果您想要 JVM 信息,请使用 JMX。 - Matt Cummings
SIGAR的GPL许可并不意味着您无法使用它,只是意味着您需要联系作者并请求其他许可证。作者通常很乐意接受少量费用并允许商业许可。 - Alec Thomas
7
自1.6.4版本起,SIGAR采用Apache许可证。 - Soundlink
你知道如何获取每个独立处理器的负载吗? - zcaudate
12个回答

3

创建一个名为“Pc.bat”的批处理文件,内容如下:

typeperf -sc 1 "\mukit\processor(_Total)\%% Processor Time"

你可以使用MProcess类,代码如下:

/*
 *Md. Mukit Hasan
 *CSE-JU,35
 **/
import java.io.*;

public class MProcessor {

public MProcessor() { String s; try { Process ps = Runtime.getRuntime().exec("Pc.bat"); BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); while((s = br.readLine()) != null) { System.out.println(s); } } catch( Exception ex ) { System.out.println(ex.toString()); } }

}

通过一些字符串操作,你可以得到CPU的使用情况。你可以将同样的过程用于其他任务。

--Mukit Hasan


1
对于我(Win XP),正确的命令行是: typeperf "\processor(_total)\% processor time" 如果您将其放入批处理文件中,请使用 %% 替代 %。 我使用了 technet.microsoft.com/en-us/library/bb490960.aspx - tutejszy

0
    OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
    System.out.println((osBean.getCpuLoad() * 100) + "%");

导入com.sun.management.OperatingSystemMXBean

只有在第二次调用后才开始工作,因此请保存osBean并将其放入循环中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接