我想用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()
在Windows上返回-1) .
虽然最初根据GPL许可,但has been changed至Apache 2.0,一般可用于封闭源,商业产品 .
10 回答
顺着我提到的in this post . 我建议你使用SIGAR API . 我在自己的一个应用程序中使用SIGAR API,这很棒 . 你会发现它是稳定的,得到很好的支持,并且充满了有用的例子 . 它是开源的,具有GPL 2 Apache 2.0许可证 . 看看这个 . 我觉得它会满足你的需求 .
使用Java和Sigar API,您可以获得内存,CPU,磁盘,负载平均,网络接口信息和指标,进程表信息,路由信息等 .
以下据称可以获得CPU和RAM . 有关详细信息,请参阅ManagementFactory .
在JDK 1.7中,您可以通过com.sun.management.OperatingSystemMXBean获取系统CPU和内存使用情况 . 这与
java.lang.management.OperatingSystemMXBean
不同 .这对我来说很完美,没有任何外部API,只是本机Java隐藏功能:)
看看这篇非常详细的文章:http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#UsingaSuninternalclasstogetJVMCPUtime
要获得所用CPU的百分比,您只需要一些简单的数学:
注意:您必须导入
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命令 .
创建一个批处理文件“Pc.bat”,然后输入typeperf -sc 1“\ mukit \ processor(_Total)\ %% Processor Time”
你可以使用类MProcess,
}
然后经过一些字符串操作后,您就可以使用CPU了 . 您可以将相同的过程用于其他任务 .
--Mukit Hasan
以下代码仅适用于Linux(可能是Unix),但它适用于实际项目 .