赞
踩
这里需要引入两个依赖包:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.3.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
HardWareUtil:
import oshi.SystemInfo; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory; import oshi.software.os.FileSystem; import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.Util; import src.com.dxc.enumerate.SizeEnum; import src.com.dxc.model.*; import oshi.hardware.CentralProcessor.TickType; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Properties; /** * 硬件信息工具类 * * @Author xincheng.du * @Date 2023/7/6 17:17 */ public class HardWareUtil { private HardWareUtil() {} /** * 等待休眠时间,单位ms */ private static final int WAIT_TIME_MS = 1000; /** * 获取cpu信息 * * @return cpu信息 */ public static CpuInfo getCpuInfo() { oshi.SystemInfo si = new oshi.SystemInfo(); CentralProcessor processor = si.getHardware().getProcessor(); // CPU信息 long[] prevTicks = processor.getSystemCpuLoadTicks(); Util.sleep(WAIT_TIME_MS); long[] ticks = processor.getSystemCpuLoadTicks(); long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; long softIrq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; long ioWait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; long totalCpu = user + nice + cSys + idle + ioWait + irq + softIrq + steal; CpuInfo cpuInfo = new CpuInfo(); cpuInfo.setCpuNum(processor.getLogicalProcessorCount()); cpuInfo.setTotal(totalCpu); cpuInfo.setSys(cSys); cpuInfo.setUsed(user); cpuInfo.setWait(ioWait); cpuInfo.setFree(idle); return cpuInfo; } /** * 获取内存信息 * * @param size 大小单位,默认为B * @return 内存信息 */ public static MemoryInfo getMemoryInfo(SizeEnum size) { SystemInfo si = new SystemInfo(); GlobalMemory memory = si.getHardware().getMemory(); // 内存信息 MemoryInfo mem = new MemoryInfo(); mem.setTotal(Objects.isNull(size) ? memory.getTotal() : (float) memory.getTotal() / size.getSize()); mem.setUsed(Objects.isNull(size) ? (memory.getTotal() - memory.getAvailable()) : (float) (memory.getTotal() - memory.getAvailable()) / size.getSize()); mem.setFree(Objects.isNull(size) ? memory.getAvailable() : (float) memory.getAvailable() / size.getSize()); return mem; } /** * 获取服务器信息 * * @return 服务器信息 */ public static SystemDetails getSystemInfo() { // 服务器信息 SystemDetails details = new SystemDetails(); Properties props = System.getProperties(); details.setComputerName(IpUtils.getHostName()); details.setComputerIp(IpUtils.getHostIp()); details.setOsName(props.getProperty("os.name")); details.setOsArch(props.getProperty("os.arch")); details.setUserDir(props.getProperty("user.dir")); return details; } /** * 获取Java虚拟机信息 */ public static JvmInfo getJvmInfo() { JvmInfo jvmInfo = new JvmInfo(); Properties props = System.getProperties(); jvmInfo.setTotal(Runtime.getRuntime().totalMemory()); jvmInfo.setMax(Runtime.getRuntime().maxMemory()); jvmInfo.setFree(Runtime.getRuntime().freeMemory()); jvmInfo.setVersion(props.getProperty("java.version")); jvmInfo.setHome(props.getProperty("java.home")); return jvmInfo; } /** * 获取磁盘信息 */ public static List<SysFile> getSysFiles() { SystemInfo si = new SystemInfo(); // 获取操作系统 OperatingSystem operatingSystem = si.getOperatingSystem(); // 获取操作系统的文件系统 FileSystem fileSystem = operatingSystem.getFileSystem(); // 获取文件存储信息 List<OSFileStore> fsArray = fileSystem.getFileStores(); List<SysFile> sysFiles = new ArrayList<>(); for (OSFileStore fs : fsArray) { // 获取可用空间 long free = fs.getUsableSpace(); // 获取总空间 long total = fs.getTotalSpace(); long used = total - free; SysFile sysFile = new SysFile(); sysFile.setDirName(fs.getMount()); sysFile.setSysTypeName(fs.getType()); sysFile.setTypeName(fs.getName()); sysFile.setTotal(convertFileSize(total)); sysFile.setFree(convertFileSize(free)); sysFile.setUsed(convertFileSize(used)); sysFile.setUsage(mul(div(used, total, 4), 100)); sysFiles.add(sysFile); } return sysFiles; } /** * 字节转换 * * @param size 字节大小 * @return 转换后值 */ public static String convertFileSize(long size) { if (size >= SizeEnum.GB.getSize()) { return String.format("%.1f GB", (float) size / SizeEnum.GB.getSize()); } else if (size >= SizeEnum.MB.getSize()) { float f = (float) size / SizeEnum.MB.getSize(); return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); } else if (size >= SizeEnum.KB.getSize()) { float f = (float) size / SizeEnum.KB.getSize(); return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); } else { return String.format("%d B", size); } } /** * 提供精确的乘法运算。 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); if (b1.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.doubleValue(); } return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); } }
CpuInfo:
import lombok.Data; /** * CPU相关信息 * * @Author xincheng.du * @Date 2023/7/6 17:17 */ @Data public class CpuInfo { /** * 核心数 */ private int cpuNum; /** * CPU总的使用率 */ private double total; /** * CPU系统使用率 */ private double sys; /** * CPU用户使用率 */ private double used; /** * CPU当前等待率 */ private double wait; /** * CPU当前空闲率 */ private double free; }
JvmInfo:
import lombok.Data; /** * JVM相关信息 * * @Author xincheng.du * @Date 2023/7/6 17:17 */ @Data public class JvmInfo { /** * 当前JVM占用的内存总数(M) */ private double total; /** * JVM最大可用内存总数(M) */ private double max; /** * JVM空闲内存(M) */ private double free; /** * JDK版本 */ private String version; /** * JDK路径 */ private String home; }
MemoryInfo:
import lombok.Data; /** * 內存相关信息 * * @Author xincheng.du * @Date 2023/7/6 17:17 */ @Data public class MemoryInfo { /** * 内存总量 */ private double total; /** * 已用内存 */ private double used; /** * 剩余内存 */ private double free; }
SysFile:
/** * 系统文件相关信息 * * @Author xincheng.du * @Date 2023/7/6 17:17 */ @Data public class SysFile { /** * 盘符路径 */ private String dirName; /** * 盘符类型 */ private String sysTypeName; /** * 文件类型 */ private String typeName; /** * 总大小 */ private String total; /** * 剩余大小 */ private String free; /** * 已经使用量 */ private String used; /** * 资源的使用率 */ private double usage; }
SystemDetails:
import lombok.Data; /** * 系统相关信息 * * @Author xincheng.du * @Date 2023/7/6 17:17 */ @Data public class SystemDetails { /** * 服务器名称 */ private String computerName; /** * 服务器Ip */ private String computerIp; /** * 项目路径 */ private String userDir; /** * 操作系统 */ private String osName; /** * 系统架构 */ private String osArch; }
SizeEnum:
import lombok.AllArgsConstructor; import lombok.Getter; /** * 大小枚举 * * @Author xincheng.du * @Date 2023/7/6 11:42 */ @AllArgsConstructor public enum SizeEnum { /** * 1KB = 1024B */ KB(1024), /** * 1MB = 1024KB */ MB(KB.size * 1024), /** * 1GB = 1024MB */ GB(MB.size * 1024); /** * 1(K/M/G)B = ? B */ @Getter private final long size; }
public static void main(String[] args) {
CpuInfo cpuInfo = HardWareUtil.getCpuInfo();
JvmInfo jvmInfo = HardWareUtil.getJvmInfo();
SystemDetails systemInfo = HardWareUtil.getSystemInfo();
MemoryInfo memoryInfo = HardWareUtil.getMemoryInfo(SizeEnum.GB);
List<SysFile> sysFiles = HardWareUtil.getSysFiles();
System.out.println(cpuInfo);
System.out.println(jvmInfo);
System.out.println(systemInfo);
System.out.println(memoryInfo);
System.out.println(sysFiles);
}
控制台输出:
CpuInfo(cpuNum=16, total=16501.0, sys=329.0, used=657.0, wait=0.0, free=15419.0)
JvmInfo(total=2.64241152E8, max=4.211081216E9, free=2.5297664E8, version=11.0.18, home=C:\Program Files\Java\jdk-11)
SystemDetails(computerName=DESKTOP-HPOJ5DN, computerIp=192.168.110.202, userDir=E:\JavaWorkspace\oshi_study, osName=Windows 10, osArch=amd64)
MemoryInfo(total=15.683177947998047, used=11.597965240478516, free=4.085212707519531)
[SysFile(dirName=C:, sysTypeName=NTFS, typeName=本地固定磁盘 (C:), total=250.0 GB, free=159.6 GB, used=90.4 GB, usage=36.17), SysFile(dirName=D:, sysTypeName=NTFS, typeName=本地固定磁盘 (D:), total=224.7 GB, free=219.0 GB, used=5.8 GB, usage=2.56), SysFile(dirName=E:, sysTypeName=NTFS, typeName=本地固定磁盘 (E:), total=476.9 GB, free=435.4 GB, used=41.5 GB, usage=8.71)]
注:本文部分代码参考自开源框架若依,官网地址:http://www.ruoyi.vip/,官方文档地址:http://doc.ruoyi.vip/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。