一、導(dǎo)包
這里需要引入兩個(gè)依賴包:
<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() {}
/**
* 等待休眠時(shí)間,單位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;
}
/**
* 獲取內(nèi)存信息
*
* @param size 大小單位,默認(rèn)為B
* @return 內(nèi)存信息
*/
public static MemoryInfo getMemoryInfo(SizeEnum size) {
SystemInfo si = new SystemInfo();
GlobalMemory memory = si.getHardware().getMemory();
// 內(nèi)存信息
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;
}
/**
* 獲取服務(wù)器信息
*
* @return 服務(wù)器信息
*/
public static SystemDetails getSystemInfo() {
// 服務(wù)器信息
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虛擬機(jī)信息
*/
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();
// 獲取操作系統(tǒng)
OperatingSystem operatingSystem = si.getOperatingSystem();
// 獲取操作系統(tǒng)的文件系統(tǒng)
FileSystem fileSystem = operatingSystem.getFileSystem();
// 獲取文件存儲(chǔ)信息
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;
}
/**
* 字節(jié)轉(zhuǎn)換
*
* @param size 字節(jié)大小
* @return 轉(zhuǎn)換后值
*/
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);
}
}
/**
* 提供精確的乘法運(yùn)算。
* @param v1 被乘數(shù)
* @param v2 乘數(shù)
* @return 兩個(gè)參數(shù)的積
*/
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();
}
/**
* 提供(相對(duì))精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指
* 定精度,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。
* @return 兩個(gè)參數(shù)的商
*/
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相關(guān)信息
*
* @Author xincheng.du
* @Date 2023/7/6 17:17
*/
@Data
public class CpuInfo {
/**
* 核心數(shù)
*/
private int cpuNum;
/**
* CPU總的使用率
*/
private double total;
/**
* CPU系統(tǒng)使用率
*/
private double sys;
/**
* CPU用戶使用率
*/
private double used;
/**
* CPU當(dāng)前等待率
*/
private double wait;
/**
* CPU當(dāng)前空閑率
*/
private double free;
}
JvmInfo:
import lombok.Data;
/**
* JVM相關(guān)信息
*
* @Author xincheng.du
* @Date 2023/7/6 17:17
*/
@Data
public class JvmInfo
{
/**
* 當(dāng)前JVM占用的內(nèi)存總數(shù)(M)
*/
private double total;
/**
* JVM最大可用內(nèi)存總數(shù)(M)
*/
private double max;
/**
* JVM空閑內(nèi)存(M)
*/
private double free;
/**
* JDK版本
*/
private String version;
/**
* JDK路徑
*/
private String home;
}
MemoryInfo:
import lombok.Data;
/**
* 內(nèi)存相關(guān)信息
*
* @Author xincheng.du
* @Date 2023/7/6 17:17
*/
@Data
public class MemoryInfo {
/**
* 內(nèi)存總量
*/
private double total;
/**
* 已用內(nèi)存
*/
private double used;
/**
* 剩余內(nèi)存
*/
private double free;
}
SysFile:
/**
* 系統(tǒng)文件相關(guān)信息
*
* @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;
/**
* 已經(jīng)使用量
*/
private String used;
/**
* 資源的使用率
*/
private double usage;
}
SystemDetails:
import lombok.Data;
/**
* 系統(tǒng)相關(guān)信息
*
* @Author xincheng.du
* @Date 2023/7/6 17:17
*/
@Data
public class SystemDetails {
/**
* 服務(wù)器名稱
*/
private String computerName;
/**
* 服務(wù)器Ip
*/
private String computerIp;
/**
* 項(xiàng)目路徑
*/
private String userDir;
/**
* 操作系統(tǒng)
*/
private String osName;
/**
* 系統(tǒng)架構(gòu)
*/
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;
}
三、測(cè)試
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);
}
控制臺(tái)輸出:
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)]文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-744299.html
注:本文部分代碼參考自開(kāi)源框架若依,官網(wǎng)地址:http://www.ruoyi.vip/,官方文檔地址:http://doc.ruoyi.vip/文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744299.html
到了這里,關(guān)于Java 使用 oshi 獲取當(dāng)前服務(wù)硬件信息(操作系統(tǒng)、CPU、內(nèi)存、磁盤)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!