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获取主机信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • idea插件篇之java内存分析工具(JProfiler)的使用

    前言 在运行java的时候有时候想测试云运行时占用内存情况,这时候就需要使用测试工具查看了.在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在idea中也有这么一个插件,就是JProfilerl. 下载安装 打开idea,进入设置界面 安装之后重启即可. 安装成功后查看情况. 这是什么情况呢,这是这个插件启动需要依赖一个可执行的文件,就是源生的JAVA PROFILER 去官网下载 https://www.ej-technologies.

  • java ThreadPool线程池的使用,线程池工具类用法说明

    实际上java已经提供线程池的实现 ExecutorService. 为了更方便的使用和管理.这里提供一个线程池工具类,方便大家的使用. 直接看看代码: 使用 public static void main(String[] args) { //实例化一个固定数目的线程池.具体参考类的构造方法 ThreadPool threadPool=new ThreadPool(ThreadPool.FixedThread,5); //线程池执行线程 threadPool.execute(new Runna

  • java身份证合法性校验工具类实例代码

    1.身份证规则 计算方法(来源百度) 将前面的身份证号码17位数分别乘以不同的系数.从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2. 将这17位数字和系数相乘的结果相加. 用加出来和除以11,看余数是多少? 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字.其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2.(即余数0对应1,余数1对应0,余数2对应X-) 通过上面得知如果余数是3,就会在身份

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

    最近在筹划做一个监控系统.其中就要获取主机信息,其中遇到一些问题.在此做个记录,以便以后查阅. 在该监控系统中,想要做到主机的CPU.内存.磁盘.网络.线程.JVM内存.JVM GC 等维度的监控,JVM方面的监控还好说,直接用JMX做就行了,关键是主机信息不好做监控,JDK没有直接的方案获取系统主机信息.在刚开始想到了以下几种方式获取主机维度的信息. 一.命令行 刚开始想的是用最常用的命令行获取主机维度的信息,具体做法是针对不同的系统,写不同的命令.比如说Linux系统,使用TOP命令就能获取

  • Java实用工具之StringJoiner详解

    背景 在平时的业务开发中,我们可能会遇到字符串列表根据分隔符进行拼接的需求.比如: 输入: 数组:["a","b","c"]分隔符:"," 输出: "a,b,c" 处理 通常我们可以使用StringBuilder根据下标位置决定是否需要添加分隔符以达到目的,比如: public static void main(String[] args) { StringBuilder sb = new StringBu

  • Java远程调用Shell脚本并获取输出信息【推荐】

    1.添加依赖 <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId&g

  • Mysql中 show table status 获取表信息的方法

    使用方法 mysql>show table status; mysql>show table status like 'esf_seller_history'\G; mysql>show table status like 'esf_%'\G; 样例: mysql>show table status like 'esf_seller_history'\G; 1.Name 表名称 2.Engine: 表的存储引擎 3.Version: 版本 4.Row_format 行格式.对于My

  • Android实现获取SERIAL信息的方法

    本文实例讲述了Android实现获取SERIAL信息的方法.分享给大家供大家参考.具体如下: android.os.build.serial 在API 9 中引入,如果低于9的系统可以通过这个方法获取这个信息值 java代码如下: public static String getDeviceSerial() { String serial = "unknown"; try { Class clazz = Class.forName("android.os.Build"

  • SpringMVC中RequestContextHolder获取请求信息的方法

    RequestContextHolder的作用是: 在Service层获取获取request和response信息 代码示例: ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attrs.getRequest(); 源码分析: 定义了两个ThreadLocal变量用来存储Reque

  • Go语言扫描目录并获取相关信息的方法

    本文实例讲述了Go语言扫描目录并获取相关信息的方法.分享给大家供大家参考.具体分析如下: 前言:最近看到Go里面有一个func很容易就可以扫描整个目录,并且可以得到相应的目录和文件信息,所以我将其进行了封装,拿到file info的所有信息 这样就可以方便的做其它用途了. 直接上代码,代码基于Go version 1 复制代码 代码如下: package main import (     "path/filepath"     "os"     "fla

  • PHP版微信第三方实现一键登录及获取用户信息的方法

    本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要"服务号"才可以哦,所以必须到官方申请. 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以

  • PHP获取服务器端信息的方法

    本文实例讲述了PHP获取服务器端信息的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: /**  * 获取系统信息  *  * @return array  */ function getSystemInfo() {  $systemInfo = array();    // 系统  $systemInfo['os'] = PHP_OS;    // PHP版本  $systemInfo['phpversion'] = PHP_VERSION;    // Apache版本

  • python实现根据用户输入从电影网站获取影片信息的方法

    本文实例讲述了python实现根据用户输入从电影网站获取影片信息的方法.分享给大家供大家参考.具体如下: 这段python代码主要演示了用户终端输入,正则表达式,网页抓取等 #!/usr/bin/env python27 #Importing the modules from BeautifulSoup import BeautifulSoup import sys import urllib2 import re import json #Ask for movie title title =

随机推荐