我想用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,通常可以用于闭源的商业产品。
来看看这篇非常详细的文章:
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。
来看看这篇非常详细的文章:
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。