我目前正在构建一个Java应用程序,它最终可以在许多不同的平台上运行,但主要是Solaris、Linux和Windows的变体。
是否有人能够成功地提取诸如当前使用的磁盘空间、CPU利用率和底层操作系统中使用的内存等信息?Java应用程序本身正在消耗什么呢?
我希望在不使用JNI的情况下获得这些信息。
我目前正在构建一个Java应用程序,它最终可以在许多不同的平台上运行,但主要是Solaris、Linux和Windows的变体。
是否有人能够成功地提取诸如当前使用的磁盘空间、CPU利用率和底层操作系统中使用的内存等信息?Java应用程序本身正在消耗什么呢?
我希望在不使用JNI的情况下获得这些信息。
当前回答
看一下java.lang.management包中可用的api。例如:
OperatingSystemMXBean.getSystemLoadAverage () ThreadMXBean.getCurrentThreadCpuTime () ThreadMXBean.getCurrentThreadUserTime ()
还有很多其他有用的东西。
其他回答
通常,为了获得较低级别的操作系统信息,您可以通过Runtime.exec()调用特定于操作系统的命令,这些命令会提供您想要的信息,或者读取Linux中的/proc/*等文件。
我认为最好的方法是通过Hyperic实现SIGAR API。它适用于大多数主要的操作系统(几乎所有现代的操作系统),并且非常容易使用。开发者在他们的论坛和邮件列表上的反应非常积极。我还喜欢它是GPL2 Apache授权的。他们也提供了大量的Java示例!
SIGAR ==系统信息,收集和报告工具。
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似乎是最好的选择。
有一个使用JNA(因此不需要安装本机库)的Java项目正在积极开发中。它目前支持Linux, OSX, Windows, Solaris和FreeBSD,并提供RAM, CPU,电池和文件系统信息。
https://github.com/oshi/oshi
为了在java代码中获得1分钟,5分钟和15分钟的系统负载平均值,你可以通过执行cat /proc/loadavg命令来做到这一点,并如下所示:
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("cat /proc/loadavg").getInputStream()));
String avgLine = br.readLine();
System.out.println(avgLine);
List<String> avgLineList = Arrays.asList(avgLine.split("\\s+"));
System.out.println(avgLineList);
System.out.println("Average load 1 minute : " + avgLineList.get(0));
System.out.println("Average load 5 minutes : " + avgLineList.get(1));
System.out.println("Average load 15 minutes : " + avgLineList.get(2));
通过执行free -m命令获取物理系统内存,然后解释如下:
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("free -m").getInputStream()));
String line;
String memLine = "";
int index = 0;
while ((line = br.readLine()) != null) {
if (index == 1) {
memLine = line;
}
index++;
}
// total used free shared buff/cache available
// Mem: 15933 3153 9683 310 3097 12148
// Swap: 3814 0 3814
List<String> memInfoList = Arrays.asList(memLine.split("\\s+"));
int totalSystemMemory = Integer.parseInt(memInfoList.get(1));
int totalSystemUsedMemory = Integer.parseInt(memInfoList.get(2));
int totalSystemFreeMemory = Integer.parseInt(memInfoList.get(3));
System.out.println("Total system memory in mb: " + totalSystemMemory);
System.out.println("Total system used memory in mb: " + totalSystemUsedMemory);
System.out.println("Total system free memory in mb: " + totalSystemFreeMemory);