如何在java程序中获取OS属性?

时间:2015-07-23 11:02:48

标签: java operating-system jmx mbeans

您好我需要获取有关操作系统物理内存和CPU使用情况的详细信息以及其他详细信息。我无法为已有的API支付任何金额。我可以使用任何免费的API,或者我可以编写自己的API。

我需要下图中的所有细节。

enter image description here

在上图中,我必须得到以下值

  1. 缓存
  2. 可用
  3. 像这样我需要的所有价值观。 为此我搜索了很多并得到了一些暗示。我使用下面的代码得到了第一个值物理内存总值。

    public class MBeanServerDemo {
        public MBeanServerDemo() {
            super();
        }
    
        public static void main(String... a) throws Exception {
            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
            Object attribute =
                mBeanServer.getAttribute(new ObjectName("java.lang", "type", "OperatingSystem"), "TotalPhysicalMemorySize");
            long l = Long.parseLong(attribute.toString());
            System.out.println("Total memory: " + (l / (1024*1024)));
        }
    }
    

    以下是上述程序的输出

    Total memory: 3293
    

    请帮帮我。我如何实现这一目标。

    编辑:我在google上搜索了很多解决方案,我在stackoverflow.com上发现了很多帖子。但在所有这些帖子中,人们只讨论了内存细节。我需要关于Kernal(分页和非分页)等的所有细节。请参阅这篇文章......

    My Requirement

    非常感谢。

3 个答案:

答案 0 :(得分:2)

请看下面的API:

SIGAR API - 系统信息收集器和报告器 https://support.hyperic.com/display/SIGAR/Home

一些示例用法:http://www.programcreek.com/java-api-examples/index.php?api=org.hyperic.sigar.Sigar

答案 1 :(得分:0)

您可以使用JNA,它提供对平台特定api的大量访问,例如win32.dll

JNA on Github

答案 2 :(得分:0)

考虑在Windows上使用jInterop执行此任务。

以MB为单位获取RAM的总量:

Ignore optional compile problems

获取CPU的总数:

  public int getRAMSizeMB() throws JIException
  {
    String query = "Select * From Win32_ComputerSystem";
    long size = 0;
    Object[] params = new Object[]
    {
      new JIString(query),
      JIVariant.OPTIONAL_PARAM()
    };
    JIVariant[] res = super.callMethodA("ExecQuery", params);
    JIVariant[][] resSet = Utils.enumToJIVariantArray(res);
    for (JIVariant[] resSet1 : resSet)
    {
      IJIDispatch ramVal = (IJIDispatch) JIObjectFactory.narrowObject(resSet1[0].getObjectAsComObject()
        .queryInterface(IJIDispatch.IID));
      size = ramVal.get("TotalPhysicalMemory").getObjectAsLong();
      break;
    }
    return Math.round((size / 1024) / 1024);

使用这些功能作为模板,您可以通过MSDN网站查找其他属性/功能以查询其他值。