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

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

我希望在不使用JNI的情况下获得这些信息。


当前回答

您可以从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());
    }
  }
}

其他回答

一个简单的方法可以用来获得操作系统级别的信息,我在我的Mac上测试,效果很好:

 OperatingSystemMXBean osBean =
        (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
    return osBean.getProcessCpuLoad();

您可以在这里找到操作系统的许多相关指标

CPU使用情况并不简单——java.lang.management通过com.sun.management.OperatingSystemMXBean.getProcessCpuTime与此接近(请参阅上面Patrick的优秀代码片段),但请注意,它只允许访问CPU在进程中花费的时间。它不会告诉你在其他进程上花费的CPU时间,甚至不会告诉你在与你的进程相关的系统活动上花费的CPU时间。

例如,我有一个网络密集型的java进程——它是唯一正在运行的东西,CPU在99%,但只有55%报告为“处理器CPU”。

甚至不要让我开始“平均负载”,因为它几乎是无用的,尽管它是MX bean中唯一与cpu相关的项目。如果只有太阳在他们偶尔的智慧暴露一些像“getTotalCpuTime”…

对于严肃的CPU监控,Matt提到的SIGAR似乎是最好的选择。

通过maven添加OSHI依赖:

<dependency>
    <groupId>com.github.dblock</groupId>
    <artifactId>oshi-core</artifactId>
    <version>2.2</version>
</dependency>

获得电池容量剩余百分比:

SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
for (PowerSource pSource : hal.getPowerSources()) {
    System.out.println(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d));
}

它仍在开发中,但您已经可以使用jHardware了

它是一个使用Java丢弃系统数据的简单库。它在Linux和Windows上都可以运行。

ProcessorInfo info = HardwareInfo.getProcessorInfo();
//Get named info
System.out.println("Cache size: " + info.getCacheSize());        
System.out.println("Family: " + info.getFamily());
System.out.println("Speed (Mhz): " + info.getMhz());
//[...]

通常,为了获得较低级别的操作系统信息,您可以通过Runtime.exec()调用特定于操作系统的命令,这些命令会提供您想要的信息,或者读取Linux中的/proc/*等文件。