我一直在研究为特定流程获取以下数据的最佳方法:
- CPU使用率
- 内存使用情况
- 磁盘使用情况
- 网络使用情况
我决定使用 OSHI(操作系统和硬件信息)API。对我来说不幸的是,这个 API 并没有给我开箱即用的所需信息,它需要一些关于如何计算的基本知识,例如每个进程的 cpu 使用率。
我的问题是:如何通过进程 id 获取内存、磁盘、网络使用情况?
使用以下每个进程的 cpu 使用数据示例
例如:
要获取 claculator.exe 运行进程的实际 CPU 使用率:
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.software.os.OSProcess;
import oshi.software.os.OperatingSystem;
public class processCPUusage {
public static void main(String[] args) throws InterruptedException {
OSProcess process;
long currentTime,previousTime = 0,timeDifference;
double cpu;
int pid = 7132;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
CentralProcessor processor = si.getHardware().getProcessor();
int cpuNumber = processor.getLogicalProcessorCount();
boolean processExists = true;
while (processExists) {
process = os.getProcess(pid); // calculator.exe process id
if (process != null) {
// CPU
currentTime = process.getKernelTime() + process.getUserTime();
if (previousTime != -1) {
// If we have both a previous and a current time
// we can calculate the CPU usage
timeDifference = currentTime - previousTime;
cpu = (100d * (timeDifference / ((double) 1000))) / cpuNumber;
System.out.println(cpu);
}
previousTime = currentTime;
Thread.sleep(1000);
} else {
processExists = false;
}
}
}
}
我正在使用的框架 https://github.com/oshi/oshi/tree/master/src/site/markdown 演示了所需的功能,但缺少适当的示例
- 语言:Java 8
- 构建工具:Maven 2
- 操作系统:Windows 10*
OSHI 库 + slf4j
<dependency>
<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>