我想用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中,这通常可以用于封闭源代码,商业产品.
顺着我在这篇文章中提到的内容.我建议你使用SIGAR API.我在自己的一个应用程序中使用SIGAR API,这很棒.你会发现它是稳定的,得到很好的支持,并且充满了有用的例子.它是开源的,具有GPL 2 Apache 2.0许可证.看看这个.我觉得它会满足你的需求.
使用Java和Sigar API,您可以获得内存,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 }
在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.
这对我来说很完美,没有任何外部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());
看看这篇非常详细的文章: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
.
对于磁盘空间,如果您有Java 6,则可以在File上使用getTotalSpace和getFreeSpace方法.如果您不使用Java 6,我相信您可以使用Apache Commons IO来获取某些方法.
我不知道有任何跨平台的方式来获取CPU使用率或内存使用率我担心.
很多这方面已经可以通过JMX获得.使用Java 5,JMX是内置的,它们包含一个带JDK的JMX控制台查看器.
如果您在自己的运行时需要此信息,则可以使用JMX手动监视,或从Java调用JMX命令.