Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法
最近在籌劃做一個(gè)監(jiān)控系統(tǒng)。其中就要獲取主機(jī)信息,其中遇到一些問題。在此做個(gè)記錄,以便以后查閱。
在該監(jiān)控系統(tǒng)中,想要做到主機(jī)的CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)、線程、JVM內(nèi)存、JVM GC 等維度的監(jiān)控,JVM方面的監(jiān)控還好說,直接用JMX做就行了,關(guān)鍵是主機(jī)信息不好做監(jiān)控,JDK沒有直接的方案獲取系統(tǒng)主機(jī)信息。在剛開始想到了以下幾種方式獲取主機(jī)維度的信息。
一、命令行
剛開始想的是用最常用的命令行獲取主機(jī)維度的信息,具體做法是針對(duì)不同的系統(tǒng),寫不同的命令。比如說Linux系統(tǒng),使用TOP命令就能獲取到CPU、內(nèi)存等方面的信息。
top -b -n 1
執(zhí)行該TOP命令就能獲取到CPU、內(nèi)存等維度的信息
Tasks: 515 total, 1 running, 511 sleeping, 3 stopped, 0 zombie Cpu(s): 14.5%us, 5.3%sy, 0.0%ni, 77.0%id, 0.8%wa, 0.0%hi, 2.4%si, 0.0%st Mem: 65779104k total, 62037048k used, 3742056k free, 425804k buffers Swap: 0k total, 0k used, 0k free, 21948492k cached
這種方式雖然好,但是需要針對(duì)不同系統(tǒng)做兼容。為了將懶字發(fā)揮到極致于是我就開始尋找現(xiàn)有的開源組件。然后找到了一個(gè)sigar的東西,貌似這個(gè)在業(yè)界內(nèi)應(yīng)用還挺廣的。
二、sigar
sigar的api用起來也挺方便的,簡單且使用人數(shù)多。
/ CPU數(shù)量(單位:個(gè)) int cpuLength = sigar.getCpuInfoList().length; print(cpuLength); // CPU的總量(單位:HZ)及CPU的相關(guān)信息 CpuInfo infos[] = sigar.getCpuInfoList(); for (int i = 0; i < infos.length; i++) {// 不管是單塊CPU還是多CPU都適用 CpuInfo info = infos[i]; print("mhz=" + info.getMhz());// CPU的總量MHz print("vendor=" + info.getVendor());// 獲得CPU的賣主,如:Intel print("model=" + info.getModel());// 獲得CPU的類別,如:Celeron print("cache size=" + info.getCacheSize());// 緩沖存儲(chǔ)器數(shù)量 }
但是,sigar需要根據(jù)不同的系統(tǒng)下載不同的庫文件,傾入性較高。
sigar 庫文件
windows平臺(tái):sigar-x86-winnt.dll
linux平臺(tái):libsigar-x86-linux.so或
solaris平臺(tái): libsigar-x86-solaris.so或libsigar-sparc-solaris.so或libsigar-sparc64-solaris.so
64位平臺(tái):分為至強(qiáng)的libsigar-ia64-linux.so和AMD的libsigar-amd64-linux.so,sigar-amd64-winnt.dll
這樣就讓我很為難了,于是繼續(xù)在網(wǎng)上尋找。終于找到了oshi。
三、oshi
看看oshi是怎么獲取系統(tǒng)信息的吧
首先,引入jar包
<dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>${oshi.version}</version> </dependency>
然后,開擼
// 獲取主機(jī)信息 SystemInfo systemInfo = new SystemInfo(); // 獲取操作系統(tǒng)信息 OperatingSystem operatingSystem = systemInfo.getOperatingSystem(); operatingSystem.getNetworkParams().getHostName(); operatingSystem.getFamily(); operatingSystem.getVersion().getVersion(); operatingSystem.getVersion().getBuildNumber(); operatingSystem.getBitness(); operatingSystem.getProcessCount(); operatingSystem.getThreadCount();
就是這么簡單,不需要不同系統(tǒng)引入不同的庫文件,也不用自己做系統(tǒng)兼容。oshi自己做了兼容,目前大概兼容些這些系統(tǒng): Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX。
四、對(duì)比
以上幾種方式,大概可以做個(gè)這樣的總結(jié):
- 命令行:靈活度高,兼容性強(qiáng),但是如果要兼容多個(gè)平臺(tái)的話,自己做還是有些麻煩。
- sigar:社區(qū)活躍度高,參考文檔全面,麻煩在于需要不同平臺(tái)引入不同的庫文件。
- oshi:拿來主義,使用方便,缺點(diǎn)在于文檔少。不過個(gè)人認(rèn)為看看github上的文檔就夠了,使用過程也沒有什么坑。
綜上,因?yàn)槲覀€(gè)人在開發(fā)的時(shí)候選擇的是oshi。
到此這篇關(guān)于Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法的文章就介紹到這了,更多相關(guān)java 使用oshi獲取主機(jī)信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編寫時(shí)間工具類ZTDateTimeUtil的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫時(shí)間工具類ZTDateTimeUtil,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11Java實(shí)現(xiàn)發(fā)送手機(jī)短信語音驗(yàn)證功能代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送手機(jī)短信語音驗(yàn)證功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09java?對(duì)象實(shí)例化過程中的多態(tài)特性解析
這篇文章主要介紹了java?對(duì)象實(shí)例化過程中的多態(tài)特性解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法
這篇文章主要介紹了Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法,在研發(fā)過程中我們需要與其他系統(tǒng)對(duì)接的場(chǎng)景,連接SQLServer拉取數(shù)據(jù),所以就用jdbc連接數(shù)據(jù)庫的方式連接外部數(shù)據(jù)源,需要的朋友可以參考下2021-10-10SpringBoot前后端分離解決跨域問題的3種解決方案總結(jié)
前后端分離大勢(shì)所趨,跨域問題更是老生常談,下面這篇文章主要給大家介紹了SpringBoot前后端分離解決跨域問題的3種解決方案,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05java通過Callable和Future來接收線程池的執(zhí)行結(jié)果
這篇文章主要介紹了java通過Callable和Future來接收線程池的執(zhí)行結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08