如何使用Java监视计算机的CPU,内存和磁盘使用情况?

时间:2020-03-05 18:48:36  来源:igfitidea点击:

我想用Java监视以下系统信息:

  • 当前的CPU使用率**(百分比)
  • 可用内存*(可用/总计)
  • 可用磁盘空间(可用/总)*请注意,我的意思是整个系统可用的总内存,而不仅仅是JVM。

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

如果有一个免费的库以可靠的跨平台方式执行此操作,那将是很好的(即使它进行了外部调用或者本身使用了本机代码)。

任何建议,不胜感激。

为了澄清,我想获得整个系统的当前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,它通常可用于封闭源商业产品。

解决方案

回答

对于磁盘空间,如果我们具有Java 6,则可以在File上使用getTotalSpace和getFreeSpace方法。如果我们不使用Java 6,我相信我们可以使用Apache Commons IO来获得一些帮助。

我恐怕没有任何跨平台的方法来获得CPU使用率或者内存使用率。

回答

以下内容可以使我们获得CPU和RAM。有关更多详细信息,请参见ManagementFactory。

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

private static void printUsage() {
  OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
  for (Method method : operatingSystemMXBean.getClass().getDeclaredMethods()) {
    method.setAccessible(true);
    if (method.getName().startsWith("get")
        && Modifier.isPublic(method.getModifiers())) {
            Object value;
        try {
            value = method.invoke(operatingSystemMXBean);
        } catch (Exception e) {
            value = e;
        } // try
        System.out.println(method.getName() + " = " + value);
    } // if
  } // for
}

回答

遵循我在这篇文章中提到的内容。我建议我们使用SIGAR API。我在自己的一个应用程序中使用了SIGAR API,这很棒。我们会发现它是稳定的,受良好支持的,并且充满了有用的示例。它是开源的,具有GPL 2 Apache 2.0许可证。一探究竟。我感觉它将满足需求。

使用Java和Sigar API,我们可以获得内存,CPU,磁盘,平均负载,网络接口信息和度量,进程表信息,路由信息等。

回答

许多这些已经可以通过JMX获得。在Java 5中,JMX是内置的,它们包括JDK的JMX控制台查看器。

我们可以使用JMX进行手动监视,或者如果需要在自己的运行时中从Java调用JMX命令。

回答

以下代码仅适用于Linux(也许是Unix),但可在实际项目中使用。

private double getAverageValueByLinux() throws InterruptedException {
    try {

        long delay = 50;
        List<Double> listValues = new ArrayList<Double>();
        for (int i = 0; i < 100; i++) {
            long cput1 = getCpuT(pattern);
            Thread.sleep(delay);
            long cput2 = getCpuT(pattern);
            double cpuproc = (1000d * (cput2 - cput1)) / (double) delay;
            listValues.add(cpuproc);
        }
        listValues.remove(0);
        listValues.remove(listValues.size() - 1);
        double sum = 0.0;
        for (Double double1 : listValues) {
            sum += double1;
        }
        return sum / listValues.size();
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }

}

private long getCpuT(Pattern pattern) throws FileNotFoundException, IOException {
    BufferedReader reader = new BufferedReader(new FileReader("/proc/stat"));
    String line = reader.readLine();
    Matcher m = pattern.matcher(line);

    long cpuUser = 0;
    long cpuSystem = 0;
    if (m.find()) {
        cpuUser = Long.parseLong(m.group(1));
        cpuSystem = Long.parseLong(m.group(3));
    }
    return cpuUser + cpuSystem;
}

回答

制作一个批处理文件" Pc.bat",
typeperf -sc 1" \ mukit \ processor(_Total)\ %% Processor Time"

我们可以使用MProcess类,

然后,在进行了一些字符串操作之后,就可以使用CPU。我们可以对其他任务使用相同的过程。

-穆奇特·哈桑(Mukit Hasan)

回答

看一下这篇非常详细的文章:
http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclass获取JVMCPU时间

要获得使用的CPU百分比,我们需要做的是一些简单的数学运算:

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

注意:我们必须导入com.sun.management.OperatingSystemMXBean,而不是java.lang.management.OperatingSystemMXBean

代码数量不匹配