文章目录
- 1、获取任务管理器运行内存、各磁盘内存
- 2、获取CPU使用率
1、获取任务管理器运行内存、各磁盘内存
1.代码实现:
/**
* 获取内存使用情况
*/
public static void getMemory() throws IOException {
OperatingSystemMXBean mem = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
// 获取内存总容量
long totalMemorySize = mem.getTotalPhysicalMemorySize();
// 获取可用内存容量(剩余物理内存)
long freeMemorySize = mem.getFreePhysicalMemorySize();
// 空闲的交换容量
long freeSwapSpaceSize = mem.getFreeSwapSpaceSize();
float usedRAM = (float)(((totalMemorySize - freeMemorySize) * 1.0 / totalMemorySize) * 100);
System.out.println("物理内存总容量totalMemorySize:" + transformation(totalMemorySize) );
System.out.println("剩余物理内存可用容量freeMemorySize:" + transformation(freeMemorySize));
System.out.println("usedRAM:" + usedRAM);
System.out.println("空闲的交换容量:" + transformation(freeSwapSpaceSize));
Runtime runtime = Runtime.getRuntime();
// java虚拟机中的内存总量,可用内存空间 单位为byte,默认为系统的1/64
long totalMemory = runtime.totalMemory();
// java虚拟机试图使用的最大内存量 最大可用内存空间 单位byte,默认为系统的1/4
long maxMemory = runtime.maxMemory();
// java 虚拟机中的空闲内存量 空闲空间 单位byte, 默认为系统的1/4
long freeMemory = runtime.freeMemory();
float usedRAMJava = (float)(((totalMemory - freeMemory) * 1.0 / totalMemory) * 100);
System.out.println("java虚拟机中的内存总量:" + totalMemory / 1024 / 1024 + "MB" );
System.out.println("java虚拟机试图使用的最大内存量:" + maxMemory / 1024 / 1024 + "MB" );
System.out.println("java虚拟机中的空闲内存量:" + freeMemory / 1024 / 1024 + "MB" );
System.out.println("java虚拟机中的剩余内存占总量:" + usedRAMJava + "%" );
DecimalFormat df = new DecimalFormat("#0.00");
File[] disks = File.listRoots();
for (File file : disks) {
// 获取盘符
System.out.print(file.getCanonicalPath() + " ");
// 获取总容量
long totalSpace = file.getTotalSpace();
// 获取剩余容量
long usableSpace = file.getUsableSpace();
// 获取已经使用的容量
long freeSpace = totalSpace - usableSpace;
// 获取使用率
float useRate = (float)((freeSpace * 1.0 / totalSpace) * 100);
System.out.print("总容量: " + transformation(totalSpace));
System.out.print("已经使用: " + transformation(freeSpace));
System.out.print("剩余容量: " + transformation(usableSpace));
System.out.println("使用率: " + Double.parseDouble(df.format(useRate)) + "% ");
}
}
/**
* 将字节容量转化为GB
*/
public static String transformation(long size){
return (float) size / 1024 / 1024 / 1024 + "GB"+" ";
}
2.运行结果
3.任务管理器
2、获取CPU使用率
通过Java获取CPU使用率,搜索大多方法都是使用getSystemCpuLoad()来获取,具体代码如下:
public void getCpu() {
OperatingSystemMXBean mem = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
System.out.println("CPU使用率:" + mem.getSystemCpuLoad());
System.out.println("进程占用CPU:" + mem.getProcessCpuLoad());
}
代码结果如下:
问题:为什么获取的CPU使用率是0.0?而且在其他电脑上还出现了getSystemCpuLoad和getProcessCpuLoad获取的都为-1(负数)的情况?
经过多次搜索,大概看到的解析是说跟JDK的版本有关系,或者是跟电脑本身无权限访问的原因(未求证)。
思路转换,寻找其他方法:
CPU使用率是如下图任务管理器中利用率的百分比:
还可以通过cmd终端窗口查看CPU使用率,cmd命令如下:
# 一秒中输出一次
typeperf "processor(_total)\% processor time"
# 若是只要执行一次,末尾添加 -sc 1, 或 -sc 次数
typeperf "processor(_total)\% processor time" -sc 1
执行结果:
其次还可使用wmic命令,根据搜索loadpercentage也代表CPU利用率
wmic cpu get loadpercentage
运行结果:
即,想要通过Java获取CPU的使用率就可以用Runtime.getRuntime().exec()调用终端窗口cmd执行相应命令,实现代码如下所示:
public static int getCpuUseRatio() {
Process process = null;
BufferedReader bufferedReader = null;
try {
String CMD_PYTHON = "wmic cpu get loadpercentage";
process = Runtime.getRuntime().exec(CMD_PYTHON);
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
String res;
while ((res = bufferedReader.readLine()) != null) {
String strs = res.trim(); // 去除输出发前后空格
if (!"".equals(strs) && !"LoadPercentage".equals(strs)) {
return Integer.parseInt(strs);
}
}
bufferedReader.close();
process.destroy();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null){
bufferedReader.close();
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
// 获取失败,或出现异常
return -1;
}