有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

操作系统如何在java程序中获取操作系统属性?

嗨,我需要获得有关操作系统物理内存和cpu使用情况的详细信息以及其他详细信息。我不能为已经可用的API支付任何金额。我可以使用任何免费的API,也可以编写自己的API

我需要下图中的所有细节

enter image description here

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

  1. 总数
  2. 缓存
  3. 可用
  4. 免费的

像这样我需要的所有价值观。 为此,我搜索了很多,得到了一些提示。我使用下面的代码得到了第一个值—物理内存总值

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

请帮帮我。我如何做到这一点

编辑:我在谷歌上搜索了很多解决方案,在stackoverflow中找到了很多帖子。通用域名格式。但在所有这些帖子中,人们只讨论了记忆的细节。我需要有关内核(分页和非分页)等的所有细节。请参阅这篇文章

My Requirement

非常感谢


共 (3) 个答案

  1. # 1 楼答案

    在Windows上使用JINDOP进行此任务。

    要获取以MB为单位的RAM总量,请执行以下操作:

      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);
    

    要获取CPU总量,请执行以下操作:

      public int getCpuCount() throws JIException
      {
        String query = "Select NumberOfLogicalProcessors From Win32_Processor";
        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 procVal = (IJIDispatch) JIObjectFactory.narrowObject(resSet1[0].getObjectAsComObject()
            .queryInterface(IJIDispatch.IID));
          return procVal.get("NumberOfLogicalProcessors").getObjectAsInt();
        }
        return -1;
      }
    

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

  2. # 3 楼答案

    您可以使用JNA,它提供了对特定于平台的API(如win32)的大量访问。动态链接库

    JNA on Github