Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息
1、OSHI的簡介
OSHI(Operating System and Hardware Information)是一個開源的Java庫,用于獲取和操作操作系統(tǒng)和硬件信息。
它提供了一組簡單易用的API,可以用于檢索和監(jiān)控諸如操作系統(tǒng)類型、處理器信息、內(nèi)存使用情況、硬盤信息、網(wǎng)絡(luò)接口等系統(tǒng)和硬件相關(guān)的數(shù)據(jù)。
OSHI的主要功能包括:
- 獲取操作系統(tǒng)信息:可以獲取操作系統(tǒng)的名稱、版本、構(gòu)建信息、位數(shù)等。還可以獲取操作系統(tǒng)的啟動時間、系統(tǒng)負(fù)載、當(dāng)前進(jìn)程數(shù)等信息。
- 獲取硬件信息:可以獲取處理器(CPU)的信息,包括型號、頻率、核心數(shù)、溫度等。還可以獲取內(nèi)存(RAM)的信息,包括總?cè)萘俊⒖捎萌萘?、使用率等。此外,還可以獲取硬盤(磁盤)的信息,包括型號、容量、使用率等。還可以獲取電池、網(wǎng)卡、USB設(shè)備等硬件的信息。
- 獲取網(wǎng)絡(luò)信息:可以獲取網(wǎng)絡(luò)接口(網(wǎng)卡)的信息,包括名稱、IP地址、MAC地址、接收和發(fā)送的數(shù)據(jù)量等。
- 監(jiān)控系統(tǒng)和硬件:可以通過OSHI提供的API實時監(jiān)控和收集系統(tǒng)和硬件的數(shù)據(jù),例如CPU使用率、內(nèi)存使用情況、網(wǎng)絡(luò)流量等。
使用OSHI非常簡單,只需將OSHI庫添加到你的Java項目的依賴項中,并使用OSHI提供的API來獲取所需的系統(tǒng)和硬件信息。
你可以根據(jù)需要選擇性地獲取和處理各種信息。
總的來說,OSHI是一個強大而易于使用的Java庫,可用于獲取和監(jiān)控操作系統(tǒng)和硬件信息,幫助你編寫更具交互性和功能性的系統(tǒng)監(jiān)控、硬件信息獲取和性能調(diào)優(yōu)的應(yīng)用程序。
2、OSHI的使用
2.1 引入依賴
<dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.4.0</version> </dependency>
2.2 定義參數(shù)模型
我們主要關(guān)注服務(wù)器的CPU、內(nèi)存、以及所掛在的存儲盤的空間容量使用情況等信息,具體模型如下:
- 2.2.1 CPU
public class Cpu { /** * 核心數(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; public int getCpuNum() { return cpuNum; } public void setCpuNum(int cpuNum) { this.cpuNum = cpuNum; } public double getTotal() { return Arith.round(Arith.mul(total, 100), 2); } public void setTotal(double total) { this.total = total; } public double getSys() { return Arith.round(Arith.mul(sys / total, 100), 2); } public void setSys(double sys) { this.sys = sys; } public double getUsed() { return Arith.round(Arith.mul(used / total, 100), 2); } public void setUsed(double used) { this.used = used; } public double getWait() { return Arith.round(Arith.mul(wait / total, 100), 2); } public void setWait(double wait) { this.wait = wait; } public double getFree() { return Arith.round(Arith.mul(free / total, 100), 2); } public void setFree(double free) { this.free = free; } }
- 2.2.2 內(nèi)存
public class Mem { /** * 內(nèi)存總量 */ private double total; /** * 已用內(nèi)存 */ private double used; /** * 剩余內(nèi)存 */ private double free; public double getTotal() { return Arith.div(total, (1024 * 1024 * 1024), 2); } public void setTotal(long total) { this.total = total; } public double getUsed() { return Arith.div(used, (1024 * 1024 * 1024), 2); } public void setUsed(long used) { this.used = used; } public double getFree() { return Arith.div(free, (1024 * 1024 * 1024), 2); } public void setFree(long free) { this.free = free; } public double getUsage() { return Arith.mul(Arith.div(used, total, 4), 100); } }
- 2.2.3 硬盤
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; public String getDirName() { return dirName; } public void setDirName(String dirName) { this.dirName = dirName; } public String getSysTypeName() { return sysTypeName; } public void setSysTypeName(String sysTypeName) { this.sysTypeName = sysTypeName; } public String getTypeName() { return typeName; } public void setTypeName(String typeName) { this.typeName = typeName; } public String getTotal() { return total; } public void setTotal(String total) { this.total = total; } public String getFree() { return free; } public void setFree(String free) { this.free = free; } public String getUsed() { return used; } public void setUsed(String used) { this.used = used; } public double getUsage() { return usage; } public void setUsage(double usage) { this.usage = usage; } }
- 2.2.4 具體實現(xiàn)
public class Server { private static final int OSHI_WAIT_SECOND = 1000; /** * CPU相關(guān)信息 */ private Cpu cpu = new Cpu(); /** * 內(nèi)存相關(guān)信息 */ private Mem mem = new Mem(); /** * 磁盤相關(guān)信息 */ private List<SysFile> sysFiles = new LinkedList<SysFile>(); public Cpu getCpu() { return cpu; } public void setCpu(Cpu cpu) { this.cpu = cpu; } public Mem getMem() { return mem; } public void setMem(Mem mem) { this.mem = mem; } public List<SysFile> getSysFiles() { return sysFiles; } public void setSysFiles(List<SysFile> sysFiles) { this.sysFiles = sysFiles; } public void copyTo() throws Exception { SystemInfo si = new SystemInfo(); HardwareAbstractionLayer hal = si.getHardware(); setCpuInfo(hal.getProcessor()); setMemInfo(hal.getMemory()); setSysFiles(si.getOperatingSystem()); } /** * 設(shè)置CPU信息 */ private void setCpuInfo(CentralProcessor processor) { // CPU信息 long[] prevTicks = processor.getSystemCpuLoadTicks(); Util.sleep(OSHI_WAIT_SECOND); 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; cpu.setCpuNum(processor.getLogicalProcessorCount()); cpu.setTotal(totalCpu); cpu.setSys(cSys); cpu.setUsed(user); cpu.setWait(iowait); cpu.setFree(idle); } /** * 設(shè)置內(nèi)存信息 */ private void setMemInfo(GlobalMemory memory) { mem.setTotal(memory.getTotal()); mem.setUsed(memory.getTotal() - memory.getAvailable()); mem.setFree(memory.getAvailable()); } /** * 設(shè)置磁盤信息 */ private void setSysFiles(OperatingSystem os) { FileSystem fileSystem = os.getFileSystem(); List<OSFileStore> fsArray = fileSystem.getFileStores(); for (OSFileStore fs : fsArray) { if (fs.getType().equals("ext4") || fs.getType().equals("nfs4")){ 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(Arith.mul(Arith.div(used, total, 4), 100)); sysFiles.add(sysFile); } } } /** * 字節(jié)轉(zhuǎn)換 * * @param size 字節(jié)大小 * @return 轉(zhuǎn)換后值 */ public String convertFileSize(long size) { long kb = 1024; long mb = kb * 1024; long gb = mb * 1024; if (size >= gb) { return String.format("%.1f GB", (float) size / gb); } else if (size >= mb) { float f = (float) size / mb; return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); } else if (size >= kb) { float f = (float) size / kb; return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); } else { return String.format("%d B", size); } } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
記錄一個使用Spring?Data?JPA設(shè)置默認(rèn)值的問題
這篇文章主要介紹了使用Spring?Data?JPA設(shè)置默認(rèn)值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot使用RestTemplate發(fā)送http請求的實操演示
RestTemplate是Spring 框架提供的 ,可用于在應(yīng)用中調(diào)用 rest 服務(wù),它簡化了與 http 服務(wù)的通信方式,統(tǒng)一了 RESTful 的標(biāo)準(zhǔn),封裝了 http 鏈接,本文給大家介紹了SpringBoot使用RestTemplate發(fā)送http請求的實操演示,需要的朋友可以參考下2024-11-11使用sharding-jdbc實現(xiàn)水平分表的示例代碼
本文主要介紹了sharding-jdbc實現(xiàn)水平分表,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11如何使用nexus在局域網(wǎng)內(nèi)搭建maven私服及idea的使用
這篇文章主要介紹了如何使用nexus在局域網(wǎng)內(nèi)搭建maven私服及idea的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11