Java实用工具之使用oshi获取主机信息的方法

 更新时间:2021年02月04日 10:01:08   作者:xwayway  
这篇文章主要介绍了Java实用工具之使用oshi获取主机信息的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

最近在筹划做一个监控系统。其中就要获取主机信息,其中遇到一些问题。在此做个记录,以便以后查阅。

在该监控系统中,想要做到主机的CPU、内存、磁盘、网络、线程、JVM内存、JVM GC 等维度的监控,JVM方面的监控还好说,直接用JMX做就行了,关键是主机信息不好做监控,JDK没有直接的方案获取系统主机信息。在刚开始想到了以下几种方式获取主机维度的信息。

一、命令行

刚开始想的是用最常用的命令行获取主机维度的信息,具体做法是针对不同的系统,写不同的命令。比如说Linux系统,使用TOP命令就能获取到CPU、内存等方面的信息。

top -b -n 1

执行该TOP命令就能获取到CPU、内存等维度的信息

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

这种方式虽然好,但是需要针对不同系统做兼容。为了将懒字发挥到极致于是我就开始寻找现有的开源组件。然后找到了一个sigar的东西,貌似这个在业界内应用还挺广的。

二、sigar

sigar的api用起来也挺方便的,简单且使用人数多。

/ CPU数量(单位:个) 
int cpuLength = sigar.getCpuInfoList().length; 
print(cpuLength); 
  
// CPU的总量(单位:HZ)及CPU的相关信息 
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());// 缓冲存储器数量 
}

但是,sigar需要根据不同的系统下载不同的库文件,倾入性较高。

sigar 库文件
windows平台:sigar-x86-winnt.dll
linux平台:libsigar-x86-linux.so或
solaris平台: libsigar-x86-solaris.so或libsigar-sparc-solaris.so或libsigar-sparc64-solaris.so
64位平台:分为至强的libsigar-ia64-linux.so和AMD的libsigar-amd64-linux.so,sigar-amd64-winnt.dll

这样就让我很为难了,于是继续在网上寻找。终于找到了oshi。

三、oshi

看看oshi是怎么获取系统信息的吧

首先,引入jar包

<dependency>
  <groupId>com.github.oshi</groupId>
  <artifactId>oshi-core</artifactId>
  <version>${oshi.version}</version>
</dependency>

然后,开撸

// 获取主机信息
SystemInfo systemInfo = new SystemInfo();
// 获取操作系统信息
OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
operatingSystem.getNetworkParams().getHostName();
operatingSystem.getFamily();
operatingSystem.getVersion().getVersion();
operatingSystem.getVersion().getBuildNumber();
operatingSystem.getBitness();
operatingSystem.getProcessCount();
operatingSystem.getThreadCount();

就是这么简单,不需要不同系统引入不同的库文件,也不用自己做系统兼容。oshi自己做了兼容,目前大概兼容些这些系统: Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX。

四、对比

以上几种方式,大概可以做个这样的总结:

  • 命令行:灵活度高,兼容性强,但是如果要兼容多个平台的话,自己做还是有些麻烦。
  • sigar:社区活跃度高,参考文档全面,麻烦在于需要不同平台引入不同的库文件。
  • oshi:拿来主义,使用方便,缺点在于文档少。不过个人认为看看github上的文档就够了,使用过程也没有什么坑。

综上,因为我个人在开发的时候选择的是oshi。

到此这篇关于Java实用工具之使用oshi获取主机信息的方法的文章就介绍到这了,更多相关java 使用oshi获取主机信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现简单计算器

    java实现简单计算器

    这篇文章主要为大家详细介绍了java实现简单计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • SpringBoot外部化配置示例解析

    SpringBoot外部化配置示例解析

    这篇文章主要介绍了SpringBoot外部化配置示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java编程实现统计数组中各元素出现次数的方法

    Java编程实现统计数组中各元素出现次数的方法

    这篇文章主要介绍了Java编程实现统计数组中各元素出现次数的方法,涉及java针对数组的遍历、比较、运算等相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • 使用AbstractRoutingDataSource实现数据源动态切换的实例

    使用AbstractRoutingDataSource实现数据源动态切换的实例

    AbstractRoutingDataSource 是 Spring 框架提供的一个抽象类,用于实现动态数据源路由,这个类主要用于多数据源场景,其中可以根据不同的条件动态地切换到不同的数据源,本文给大家介绍了如何使用AbstractRoutingDataSource实现数据源动态切换,需要的朋友可以参考下
    2024-03-03
  • springBoot系列常用注解(小结)

    springBoot系列常用注解(小结)

    这篇文章主要介绍了springBoot系列常用注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java 使用json-lib处理JSON详解及实例代码

    Java 使用json-lib处理JSON详解及实例代码

    这篇文章主要介绍了Java 使用json-lib处理JSON详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 教你怎么用java实现客户端与服务器一问一答

    教你怎么用java实现客户端与服务器一问一答

    这篇文章主要介绍了教你怎么用java实现客户端与服务器一问一答,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 举例讲解Java中数组和字符串类型的使用方法

    举例讲解Java中数组和字符串类型的使用方法

    这篇文章主要介绍了举例讲解Java中数组和字符串类型的使用方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Spring boot2X Consul如何使用Feign实现服务调用

    Spring boot2X Consul如何使用Feign实现服务调用

    这篇文章主要介绍了spring boot2X Consul如何使用Feign实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java中的TreeSet集合详解

    Java中的TreeSet集合详解

    这篇文章主要介绍了Java中的TreeSet集合详解,TreeSet 是一个 有序集合,它扩展了 AbstractSet 类并实现了 NavigableSet 接口,作为自平衡二叉搜索树,二叉树的每个节点包括一个额外的位,用于识别红色或黑色的节点的颜色,需要的朋友可以参考下
    2023-09-09

最新评论