获取操作系统级别的系统信息
我目前正在构建一个Java应用程序,该应用程序最终可以在许多不同的平台上运行,但主要是Solaris,Linux和Windows的变体。
有没有人能够成功提取信息,例如当前使用的磁盘空间,CPU利用率和底层操作系统中使用的内存?那么Java应用程序本身正在消耗什么呢?
最好是我想在不使用JNI的情况下获取此信息。
我目前正在构建一个Java应用程序,该应用程序最终可以在许多不同的平台上运行,但主要是Solaris,Linux和Windows的变体。
有没有人能够成功提取信息,例如当前使用的磁盘空间,CPU利用率和底层操作系统中使用的内存?那么Java应用程序本身正在消耗什么呢?
最好是我想在不使用JNI的情况下获取此信息。
您可以从运行时类中获取一些有限的内存信息。它真的不是你想要的,但我想我会为了完整性而提供它。下面是一个小示例。编辑:您还可以从 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());
}
}
}
java.lang.management 包确实为您提供了比运行时更多的信息 - 例如,它将为您提供与非堆内存()分开的堆内存()。ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
您还可以获取进程 CPU 使用率(无需编写自己的 JNI 代码),但您需要将 转换为 .这适用于Windows和Linux,我没有在其他地方测试过。java.lang.management.OperatingSystemMXBean
com.sun.management.OperatingSystemMXBean
例如。。。更频繁地调用 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();
}
}
}