如何使用Java监视计算机的CPU,内存和磁盘使用情况?
我想用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
。
代码数量不匹配