2013-03-14 90 views
0

我想在我的Unix系统上使用总内存,可用内存,CPU使用等简单的结果。 目前我正在使用shell命令top使用Java分析系统内存/ CPU统计信息

Java中是否有任何功能可以做同样的事情?

我的目标是通过Google Gauge Charts在网络应用程序中显示结果。很显然,对我来说使用Java会容易得多,而不是从Java内部执行Unix命令。

在此先感谢

回答

4
OperatingSystemMXBean operatingSystemMXBean = 
    ManagementFactory.getOperatingSystemMXBean(); 

for (Method method: operatingSystemMXBean.getClass().getMethods()) 
{ 
    method.setAccessible (true); 
    String methodName = method.getName(); 
    if (methodName.startsWith ("get") 
     && Modifier.isPublic (method.getModifiers()) 
     && OperatingSystemMXBean.class.isAssignableFrom (
      method.getDeclaringClass())) { 
     try 
     { 
      System.out.println (
       methodName.substring (3) + ": " + 
       method.invoke (operatingSystemMXBean)); 
     } 
     catch (Throwable ex) 
     { 
      // Ignore 
     } 
    } 
} 

输出是在不同的操作系统和Java版本不同。这是在Linux上的JDK 1.7的输出:

FreeSwapSpaceSize: 2172059648 
FreePhysicalMemorySize: 1757573120 
CommittedVirtualMemorySize: 26741071872 
MaxFileDescriptorCount: 8192 
OpenFileDescriptorCount: 4 
ProcessCpuLoad: 2.0251808355598717E-10 
ProcessCpuTime: 60000000 
SystemCpuLoad: 0.03673989450920194 
TotalPhysicalMemorySize: 101439979520 
TotalSwapSpaceSize: 4294950912 
Name: Linux 
ObjectName: java.lang:type=OperatingSystem 
AvailableProcessors: 12 
Arch: amd64 
SystemLoadAverage: 1.86 
Version: 2.6.32.54-0.3-default 

SystemLoadAverage相同load average通过top命令报告。

+0

你能解释一下从这个阶段到底发生了什么 - OperatingSystemMXBean.class.isAssignableFrom – 2013-03-14 05:53:18

+0

接口'java.lang.management.OperatingSystemMXBean'只定义了几个方法,而在JRE中这个接口的实际实现通常有更多的方法,所以我使用反射来在运行时发现它们。我遍历由'ManagementFactory.getOperatingSystemMXBean()'返回的对象的所有公共非静态方法,并调用1)以'get'开头的名称和2)在某些实现'OperatingSystemMXBean'接口的类中定义的方法。第二个条件可以帮助我避免诸如Object.getClass()之类的不相关的方法。 – 2013-03-14 05:59:50

+0

非常感谢:) – 2013-03-14 07:08:41

相关问题