Java使用oshi獲取當(dāng)前服務(wù)器狀態(tài)cpu、內(nèi)存、存儲(chǔ)等核心信息方式
簡(jiǎn)介
OSHI 是基于 JNA 的(本地)操作系統(tǒng)和硬件信息庫。它不需要安裝任何其他額外的本地庫,旨在提供一種跨平臺(tái)的實(shí)現(xiàn)來檢索系統(tǒng)信息,例如操作系統(tǒng)版本、進(jìn)程、內(nèi)存和 CPU 使用率、磁盤和分區(qū)、設(shè)備、傳感器等。
使用 OSHI 可以對(duì)應(yīng)用程序進(jìn)行監(jiān)控,可以對(duì)應(yīng)用程序所在的服務(wù)器資源進(jìn)行監(jiān)控,還可以監(jiān)控到其他許多指標(biāo),如下:
- 1、計(jì)算機(jī)系統(tǒng)和固件,底板
- 2、操作系統(tǒng)和版本 / 內(nèi)部版本
- 3、物理(核心)和邏輯(超線程)CPU,處理器組,NUMA 節(jié)點(diǎn)
- 4、系統(tǒng)和每個(gè)處理器的負(fù)載百分比和滴答計(jì)數(shù)器
- 5、CPU 正常運(yùn)行時(shí)間,進(jìn)程和線程
- 6、進(jìn)程正常運(yùn)行時(shí)間,CPU,內(nèi)存使用率,用戶 / 組,命令行
- 7、已使用 / 可用的物理和虛擬內(nèi)存
- 8、掛載的文件系統(tǒng)(類型,可用空間和總空間)
- 9、磁盤驅(qū)動(dòng)器(型號(hào),序列號(hào),大?。┖头謪^(qū)
- 10、網(wǎng)絡(luò)接口(IP,帶寬輸入 / 輸出)
- 11、電池狀態(tài)(電量百分比,剩余時(shí)間,電量使用情況統(tǒng)計(jì)信息)
- 12、連接的顯示器(帶有 EDID 信息)
- 13、USB 設(shè)備
- 14、傳感器(溫度,風(fēng)扇速度,電壓)
支持的平臺(tái):
- Windows
- Linux
- macOS
- UNIX (AIX, FreeBSD, OpenBSD, Solaris)
相關(guān)資料
- github 地址:https://github.com/oshi/oshi
- API 文檔:http://oshi.github.io/oshi/apidocs/
maven依賴
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.3.2</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.12.1</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.12.1</version>
</dependency>

oshi-官方示例
此外,該oshi-demo模塊包括一個(gè)OshiGui類,它實(shí)現(xiàn)了一個(gè)基本的 Swing GUI,為在 UI、監(jiān)控或警報(bào)應(yīng)用程序中使用 OSHI 的潛在可視化提供建議,如下所示。
有關(guān)基于此方法的更高級(jí) GUI,請(qǐng)參閱MooInfo 項(xiàng)目。
獲取CUP信息代碼
獲取時(shí)與windows窗口等查看CUP利用率的信息有差異,本身CUP利用率存在很大的波動(dòng)。
public static CpuEntity getCpu() throws InterruptedException {
SystemInfo systemInfo = new SystemInfo();
GlobalConfig.set(GlobalConfig.OSHI_OS_WINDOWS_CPU_UTILITY, Boolean.TRUE);
CentralProcessor processor = systemInfo.getHardware().getProcessor();
long[] prevTicks = processor.getSystemCpuLoadTicks();
// 睡眠1s
TimeUnit.SECONDS.sleep(1);
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
CpuEntity cpuEntity = new CpuEntity();
cpuEntity.setSys(new DecimalFormat("#.##").format(cSys * 1.0 / totalCpu));
cpuEntity.setUser(new DecimalFormat("#.##").format(user * 1.0 / totalCpu));
cpuEntity.setWait(new DecimalFormat("#.##").format(iowait * 1.0 / totalCpu));
cpuEntity.setWait(new DecimalFormat("#.##").format(idle * 1.0 / totalCpu));
// user + system + nice + iowait + irq + softirq + steal
long cpuUtilization = user + nice + cSys + iowait + irq + softirq + steal;
cpuEntity.setCombined(new DecimalFormat("#.##").format((cpuUtilization * 1.0 / totalCpu)*100));
return cpuEntity;
}
獲取內(nèi)存信息
public static MemoryEntity getMemory() {
OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
MemoryEntity memoryEntity = new MemoryEntity();
memoryEntity.setMemTotal(osmxb.getTotalPhysicalMemorySize() / 1024 / 1024 / 1024);
memoryEntity.setMemUsed((osmxb.getTotalPhysicalMemorySize() - osmxb.getFreePhysicalMemorySize()) / 1024 / 1024 / 1024);
return memoryEntity;
}
獲取磁盤信息
File[] roots = File.listRoots();
Long useSum = 0l;
Long totalSum = 0l;
for (File file : roots) {
long free = file.getFreeSpace();
long total = file.getTotalSpace();
long use = total - free;
useSum += change(use);
totalSum += change(total);
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice
@ControllerAdvice注解是Spring3.2中新增的注解,學(xué)名是Controller增強(qiáng)器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對(duì)于@ControllerAdvice,我們比較熟知的用法是結(jié)合@ExceptionHandler用于全局異常的處理,但其作用不止于此2022-08-08
Java中使用開源庫JSoup解析HTML文件實(shí)例
這篇文章主要介紹了Java中使用開源庫JSoup解析HTML文件實(shí)例,Jsoup是一個(gè)開源的Java庫,它可以用于處理實(shí)際應(yīng)用中的HTML,比如常見的HTML格式化就可以用它來實(shí)現(xiàn),需要的朋友可以參考下2014-09-09
Java線性結(jié)構(gòu)中的雙向鏈表實(shí)現(xiàn)原理
這篇文章將給大家詳細(xì)講解雙向鏈表的內(nèi)容,尤其是會(huì)通過代碼來進(jìn)行鏈表的操作,文中的代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07
SpringBoot實(shí)現(xiàn)熱部署的方式總結(jié)
所謂熱部署,就是在應(yīng)用正在運(yùn)行的時(shí)候升級(jí)軟件,卻不需要重新啟動(dòng)應(yīng)用,對(duì)于Java來說,熱部署就是在運(yùn)行時(shí)更新Java類文件,本文將深入探討SpringBoot有哪些方式可以實(shí)現(xiàn)熱部署,感興趣的朋友可以小編一探討學(xué)習(xí)2023-06-06
SpringBoot Actuator埋點(diǎn)和監(jiān)控及簡(jiǎn)單使用
最近做的項(xiàng)目涉及到埋點(diǎn)監(jiān)控、報(bào)表、日志分析的相關(guān)知識(shí),于是搗鼓的一番,下面把涉及的知識(shí)點(diǎn)及SpringBoot Actuator埋點(diǎn)和監(jiān)控的簡(jiǎn)單用法,給大家分享下,感興趣的朋友一起看看吧2021-11-11

