当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Java中监视计算机的CPU,内存和磁盘使用情况?》经验,为你挑选了7个好方法。

我想用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()返回-1在Windows上).

尽管最初是根据GPL许可,它已经改变到Apache 2.0中,这通常可以用于封闭源代码,商业产品.



1> Matt Cumming..:

顺着我在这篇文章中提到的内容.我建议你使用SIGAR API.我在自己的一个应用程序中使用SIGAR API,这很棒.你会发现它是稳定的,得到很好的支持,并且充满了有用的例子.它是开源的,具有GPL 2 Apache 2.0许可证.看看这个.我觉得它会满足你的需求.

使用Java和Sigar API,您可以获得内存,CPU,磁盘,负载平均,网络接口信息和指标,进程表信息,路由信息等.


使用Sigar时要小心,x64机器上存在问题... http://stackoverflow.com/questions/23405832/sigar-1-6-4-is-useless-exception-access-violation似乎图书馆没有自2010年以来不会更新

2> Eugene Yokot..:

以下据称可以获得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
}


上面代码的示例输出.此代码适用于Java 1.5.getCommittedVirtualMemorySize = 28622848 getFreePhysicalMemorySize = 228462592 getFreeSwapSpaceSize = 1129848832 getProcessCpuTime = 390625000 getTotalPhysicalMemorySize = 2147483647 getTotalSwapSpaceSize = 4294967295
@EmmanuelBourg只是为那些看到这个主题的人提供文档,有一个[bug](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6853676)与此相关.
不确定它实际上是否可靠.在具有4GB物理内存的Windows XP上,它仅报告2GB(使用Java 6和Java 7测试).总交换大小也是错误的.

3> 小智..:

在JDK 1.7中,您可以通过以下方式获得系统CPU和内存使用情况com.sun.management.OperatingSystemMXBean.这不同于java.lang.management.OperatingSystemMXBean.

long    getCommittedVirtualMemorySize()
Returns the amount of virtual memory that is guaranteed to be available to the running process in bytes, or -1 if this operation is not supported.

long    getFreePhysicalMemorySize()
Returns the amount of free physical memory in bytes.

long    getFreeSwapSpaceSize()
Returns the amount of free swap space in bytes.

double  getProcessCpuLoad()
Returns the "recent cpu usage" for the Java Virtual Machine process.

long    getProcessCpuTime()
Returns the CPU time used by the process on which the Java virtual machine is running in nanoseconds.

double  getSystemCpuLoad()
Returns the "recent cpu usage" for the whole system.

long    getTotalPhysicalMemorySize()
Returns the total amount of physical memory in bytes.

long    getTotalSwapSpaceSize()
Returns the total amount of swap space in bytes.


似乎这是命中和错过.在FreeBSD 10和OpenJDK 8上获得-1的CPU负载.

4> bizzr3..:

这对我来说很完美,没有任何外部API,只是本机Java隐藏功能:)

import com.sun.management.OperatingSystemMXBean;
...
OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(
                OperatingSystemMXBean.class);
// What % CPU load this current JVM is taking, from 0.0-1.0
System.out.println(osBean.getProcessCpuLoad());

// What % load the overall system is at, from 0.0-1.0
System.out.println(osBean.getSystemCpuLoad());



5> 小智..:

看看这篇非常详细的文章:http: //nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime

要获得所用CPU的百分比,您只需要一些简单的数学:

MBeanServerConnection mbsc = ManagementFactory.getPlatformMBeanServer();

OperatingSystemMXBean osMBean = ManagementFactory.newPlatformMXBeanProxy(
mbsc, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);

long nanoBefore = System.nanoTime();
long cpuBefore = osMBean.getProcessCpuTime();

// Call an expensive task, or sleep if you are monitoring a remote process

long cpuAfter = osMBean.getProcessCpuTime();
long nanoAfter = System.nanoTime();

long percent;
if (nanoAfter > nanoBefore)
 percent = ((cpuAfter-cpuBefore)*100L)/
   (nanoAfter-nanoBefore);
else percent = 0;

System.out.println("Cpu usage: "+percent+"%");

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



6> Matt Sheppar..:

对于磁盘空间,如果您有Java 6,则可以在File上使用getTotalSpace和getFreeSpace方法.如果您不使用Java 6,我相信您可以使用Apache Commons IO来获取某些方法.

我不知道有任何跨平台的方式来获取CPU使用率或内存使用率我担心.



7> Jason Cohen..:

很多这方面已经可以通过JMX获得.使用Java 5,JMX是内置的,它们包含一个带JDK的JMX控制台查看器.

如果您在自己的运行时需要此信息,则可以使用JMX手动监视,或从Java调用JMX命令.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有