一、Maven
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-json</artifactId>
<version>3.6.1</version>
</dependency>
二、SystemMonitorUtil
package com.java.util;
import com.java.vo.MonitorVo;
import com.sun.management.OperatingSystemMXBean;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HardwareAbstractionLayer;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
@Slf4j
public class SystemMonitorUtil {
private static SystemInfo systemInfo = new SystemInfo();
private static MonitorVo monitorVo = new MonitorVo();
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static DecimalFormat decimalFormat = new DecimalFormat(".00");
static {
monitorVo.setOs(System.getProperties().getProperty("os.name") + " " + System.getProperties().getProperty("os.arch"));
monitorVo.setCpuInfo(systemInfo.getHardware().getProcessor().getName());
monitorVo.setJvmJavaVersion(System.getProperty("java.version"));
monitorVo.setRunTime(simpleDateFormat.format(ManagementFactory.getRuntimeMXBean().getStartTime()));
}
public static MonitorVo getSysMonitor() {
MemoryUsage heapInfo = getHeapInfo();
monitorVo.setJvmHeapInit(decimalFormat.format(heapInfo.getInit() / 1024 / 1024));
monitorVo.setJvmHeapMax(decimalFormat.format(heapInfo.getMax() / 1024 / 1024));
monitorVo.setJvmHeapUsed(decimalFormat.format(heapInfo.getUsed() / 1024 / 1024));
monitorVo.setJvmHeapCommitted(decimalFormat.format(heapInfo.getCommitted() / 1024 / 1024));
MemoryUsage noHeapInfo = getNoHeapInfo();
monitorVo.setJvmNonHeapInit(decimalFormat.format(noHeapInfo.getInit() / 1024 / 1024));
monitorVo.setJvmNonHeapMax(decimalFormat.format(noHeapInfo.getMax() / 1024 / 1024));
monitorVo.setJvmNonHeapUsed(decimalFormat.format(noHeapInfo.getUsed() / 1024 / 1024));
monitorVo.setJvmNonHeapCommitted(decimalFormat.format(noHeapInfo.getCommitted() / 1024 / 1024));
monitorVo.setCpuUseRate(decimalFormat.format(getCpuUsage() * 100));
OperatingSystemMXBean memoryUsage = getMemoryUsage();
monitorVo.setRamTotal(decimalFormat.format(memoryUsage.getTotalPhysicalMemorySize() / 1024 / 1024 / 1024));
monitorVo.setRamUsed(decimalFormat.format((memoryUsage.getTotalPhysicalMemorySize() - memoryUsage.getFreePhysicalMemorySize()) / 1024 / 1024 / 1024));
HashMap<String, Double> diskUsage = getDiskUsage();
monitorVo.setDiskTotal(decimalFormat.format(diskUsage.get("total")));
monitorVo.setDiskUsed(decimalFormat.format(diskUsage.get("used")));
return monitorVo;
}
private static MemoryUsage getHeapInfo() {
return ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
}
private static MemoryUsage getNoHeapInfo() {
return ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
}
private static OperatingSystemMXBean getMemoryUsage() {
return (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
}
private static double getCpuUsage() {
return systemInfo.getHardware().getProcessor().getSystemCpuLoadBetweenTicks();
}
private static HashMap<String, Double> getDiskUsage() {
HashMap<String, Double> hashMap = new HashMap<>();
File[] files = File.listRoots();
double total = 0;
double used = 0;
for (File file : files) {
total = total + file.getTotalSpace() / 1024 / 1024 / 1024;
used = used + file.getFreeSpace() / 1024 / 1024 / 1024;
}
hashMap.put("total", total);
hashMap.put("used", used);
return hashMap;
}
private static boolean isWindows() {
return System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS");
}
private static HashMap<String, Long> getUnixDiskUsage() {
HashMap<String, Long> hashMap = new HashMap<>();
String ioCmdStr = "df -h /";
String resultInfo = runCommand(ioCmdStr);
log.info(resultInfo);
String[] data = resultInfo.split(" +");
double total = Double.parseDouble(data[10].replace("%", ""));
return hashMap;
}
private static HashMap<String, Long> getWinDiskUsage() {
HardwareAbstractionLayer hal = systemInfo.getHardware();
HWDiskStore[] diskStores = hal.getDiskStores();
HashMap<String, Long> hashMap = new HashMap<>();
long total = 0;
long used = 0;
if (diskStores != null && diskStores.length > 0) {
for (HWDiskStore diskStore : diskStores) {
long size = diskStore.getSize();
long writeBytes = diskStore.getWriteBytes();
total += size;
used += writeBytes;
}
}
hashMap.put("total", total);
hashMap.put("used", used);
return hashMap;
}
private static String runCommand(String CMD) {
StringBuilder info = new StringBuilder();
InputStreamReader isr = null;
LineNumberReader lnr = null;
try {
Process pos = Runtime.getRuntime().exec(CMD);
pos.waitFor();
isr = new InputStreamReader(pos.getInputStream());
lnr = new LineNumberReader(isr);
String line;
while ((line = lnr.readLine()) != null) {
info.append(line).append("\n");
}
} catch (Exception e) {
log.error(String.valueOf(e));
} finally {
try {
assert isr != null;
isr.close();
assert lnr != null;
lnr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return info.toString();
}
}
三、MonitorVo
package com.java.vo;
import lombok.Data;
@Data
public class MonitorVo {
private String os;
private String runTime;
private String jvmJavaVersion;
private String jvmHeapInit;
private String jvmHeapMax;
private String jvmHeapUsed;
private String jvmHeapCommitted;
private String jvmNonHeapInit;
private String jvmNonHeapMax;
private String jvmNonHeapUsed;
private String jvmNonHeapCommitted;
private String cpuInfo;
private String cpuUseRate;
private String ramTotal;
private String ramUsed;
private String diskTotal;
private String diskUsed;
}