获取操作系统级别的系统信息

新手上路,请多包涵

我目前正在构建一个 Java 应用程序,它最终可以在许多不同的平台上运行,但主要是 Solaris、Linux 和 Windows 的变体。

有没有人能够成功提取信息,例如当前使用的磁盘空间、CPU 利用率和底层操作系统中使用的内存? Java 应用程序本身正在消耗什么?

最好我想在不使用 JNI 的情况下获取这些信息。

原文由 Steve M 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 613
2 个回答

您可以从 Runtime 类中获取一些有限的内存信息。它确实不是您正在寻找的东西,但我想为了完整起见我会提供它。这是一个小例子。编辑:您还可以从 java.io.File 类获取磁盘使用信息。磁盘空间使用需要 Java 1.6 或更高版本。

 public class Main {
  public static void main(String[] args) {
    /* Total number of processors or cores available to the JVM */
    System.out.println("Available processors (cores): " +
        Runtime.getRuntime().availableProcessors());

    /* Total amount of free memory available to the JVM */
    System.out.println("Free memory (bytes): " +
        Runtime.getRuntime().freeMemory());

    /* This will return Long.MAX_VALUE if there is no preset limit */
    long maxMemory = Runtime.getRuntime().maxMemory();
    /* Maximum amount of memory the JVM will attempt to use */
    System.out.println("Maximum memory (bytes): " +
        (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));

    /* Total memory currently available to the JVM */
    System.out.println("Total memory available to JVM (bytes): " +
        Runtime.getRuntime().totalMemory());

    /* Get a list of all filesystem roots on this system */
    File[] roots = File.listRoots();

    /* For each filesystem root, print some info */
    for (File root : roots) {
      System.out.println("File system root: " + root.getAbsolutePath());
      System.out.println("Total space (bytes): " + root.getTotalSpace());
      System.out.println("Free space (bytes): " + root.getFreeSpace());
      System.out.println("Usable space (bytes): " + root.getUsableSpace());
    }
  }
}

原文由 William Brendel 发布,翻译遵循 CC BY-SA 3.0 许可协议

java.lang.management 包确实为您提供了比运行时更多的信息 - 例如,它会给您堆内存( ManagementFactory.getMemoryMXBean().getHeapMemoryUsage() ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage() 分开.

您还可以获得进程 CPU 使用率(无需编写自己的 JNI 代码),但您需要将 java.lang.management.OperatingSystemMXBean 转换为 com.sun.management.OperatingSystemMXBean 。这适用于 Windows 和 Linux,我还没有在其他地方测试过。

例如…更频繁地调用 get getCpuUsage() 方法以获得更准确的读数。

 public class PerformanceMonitor {
    private int  availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
    private long lastSystemTime      = 0;
    private long lastProcessCpuTime  = 0;

    public synchronized double getCpuUsage()
    {
        if ( lastSystemTime == 0 )
        {
            baselineCounters();
            return;
        }

        long systemTime     = System.nanoTime();
        long processCpuTime = 0;

        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
        {
            processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
        }

        double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );

        lastSystemTime     = systemTime;
        lastProcessCpuTime = processCpuTime;

        return cpuUsage / availableProcessors;
    }

    private void baselineCounters()
    {
        lastSystemTime = System.nanoTime();

        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
        {
            lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
        }
    }
}

原文由 Patrick Wilkes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题