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

如何在java程序中获取操作系统属性?,java,operating-system,jmx,mbeans,Java,Operating System,Jmx,Mbeans,嗨,我需要获得有关操作系统物理内存和cpu使用情况的详细信息以及其他详细信息。我不能为已经可用的API支付任何金额。我可以使用任何免费的API,也可以编写自己的API 我需要下图中的所有细节 在上图中,我必须得到以下值 总数 缓存 可用 免费的 像这样我需要的所有价值观。 为此,我搜索了很多,得到了一些提示。我使用下面的代码得到了第一个值—物理内存总值 public class MBeanServerDemo { public MBeanServerDemo() { s

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

我需要下图中的所有细节

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

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

    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.com上找到了很多帖子。但在所有这些帖子中,人们只讨论了记忆的细节。我需要有关内核(分页和非分页)等的所有细节。请参阅这篇文章


    非常感谢。

    您可以使用JNA,它提供了对特定于平台的API(如win32.dll)的大量访问


    您能看一下下面的API吗:

    SIGAR API-系统信息收集程序和报告程序


    一些用法示例:

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

    要获取以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网站查询其他属性/函数,以查询其他值。

    我是否需要获得使用该函数的许可证。许可证的费用是多少。谢谢你的时间。现在我正在使用sigarapi。我仍然无法获得指定的详细信息。我能够获得全部和可用的系统内存。您能告诉我如何使用SIGAR API获取缓存、页面和非页面内存的详细信息吗。谢谢。可能重复的可能重复的请帮助这。。。。。请帮忙做这件事。。