事业是栏杆,我们扶着它在深渊的边沿上走路。——高尔基《阿尔塔莫诺夫家的事业》
周六在家闲来无事学习了一下利用Sigar
获取本机服务器、系统
、CPU
、JVM
、内存
等信息
Sigar
是Hyperic-hq
产品的基础包,是Hyperic HQ
主要的数据收集组件。它用来从许多平台收集系统和处理信息
Sigar
有C
,C#
,Java
和Perl API
,java
版的API为sigar.jar sigar.jar的底层是用C语言编写的,它通过本地方法来调用操作系统API来获取系统相关数据。
注意: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
Sigar:文件下载
首先导入sigar
依赖
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
</dependency>
package space.land.util;
import lombok.SneakyThrows;
import org.hyperic.sigar.*;
import org.springframework.stereotype.Component;
import space.land.model.vo.server.ServerInfos;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
-
Title: 获取本机 服务器、系统、CPU、JVM、内存信息。
-
@author Fking<fsyvip66 @ gmail.com>
-
@version 1.0.0
-
@since 2022/1/5 18:53
*/
@Component
public class ServerUtil {
@SneakyThrows
public static ServerInfos getServerInfo() {
//服务器信息
Properties properties = System.getProperties();
Map<String, String> getenv = System.getenv();
InetAddress localHost = InetAddress.getLocalHost();
ServerInfos.ServerInfo serverInfo = ServerInfos.ServerInfo.builder().userName(getenv.get("USERNAME")).computerName(getenv.get("COMPUTERNAME")).computerDomain(getenv.get("USERDOMAIN")).serverIp(localHost.getHostAddress()).hostName(localHost.getHostName()).userHome(properties.getProperty("user.home")).userDir(properties.getProperty("user.dir")).build();
//系统信息
OperatingSystem instance = OperatingSystem.getInstance();
ServerInfos.SystemInfo systemInfo = ServerInfos.SystemInfo.builder().vendorName(instance.getVendorName()).arch(instance.getArch()).description(instance.getDescription()).version(instance.getVersion()).build();
//CPU信息
Sigar sigar = new Sigar();
List<ServerInfos.CpuInfo> cpuInfoList = new ArrayList<>();
CpuInfo[] infoList = sigar.getCpuInfoList();
CpuPerc[] cpuList = sigar.getCpuPercList();
for (int i = 0; i < infoList.length; i++) {
CpuInfo cpuInfo = infoList[i];
CpuPerc cpu = cpuList[i];
cpuInfoList.add(ServerInfos.CpuInfo.builder().mhz(cpuInfo.getMhz()).vendor(cpuInfo.getVendor()).cacheSize(cpuInfo.getCacheSize()).freqUser(cpu.getUser()).freqSys(cpu.getSys()).freqWait(cpu.getWait()).freqNice(cpu.getNice()).freqIdle(cpu.getIdle()).freqCombined(cpu.getCombined()).build());
}
//JVM信息
Runtime runtime = Runtime.getRuntime();
ServerInfos.JvmInfo jvmInfo = ServerInfos.JvmInfo.builder().totalMemory(runtime.totalMemory()).freeMemory(runtime.freeMemory()).availableProcessors(runtime.availableProcessors()).version(properties.getProperty("version")).vendor(properties.getProperty("java.vendor")).home(properties.getProperty("java.home")).specificationVersion(properties.getProperty("java.specification.version")).classPath(properties.getProperty("java.class.path")).libraryPath(properties.getProperty("java.library.path")).tmpdir(properties.getProperty("java.io.tmpdir")).dirs(properties.getProperty("java.ext.dirs")).build();
//内存信息
Mem mem = sigar.getMem();
Swap swap = sigar.getSwap();
ServerInfos.MemoryInfo memoryInfo = ServerInfos.MemoryInfo.builder().memoryTotal(mem.getTotal() / (1024 * 1024L)).memoryUsed(mem.getUsed() / (1024 * 1024L)).memoryFree(mem.getFree() / (1024 * 1024L)).swapTotal(swap.getTotal() / (1024 * 1024L)).swapUsed(swap.getUsed() / (1024 * 1024L)).swapFree(swap.getFree() / (1024 * 1024L)).build();
return ServerInfos.builder().serverInfo(serverInfo).systemInfo(systemInfo).cpuInfo(cpuInfoList).jvmInfo(jvmInfo).memoryInfo(memoryInfo).build();
}
}
~~~java
package space.land.model.vo.server;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
/**
* Title: 服务器、系统、CPU、JVM、内存信息。
*
* @author Fking<fsyvip66 @ gmail.com>
* @version 1.0.0
* @since 2022/1/7 14:53
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public class ServerInfos {
private ServerInfo serverInfo;
private SystemInfo systemInfo;
private List<CpuInfo> cpuInfo;
private JvmInfo jvmInfo;
private MemoryInfo memoryInfo;
/**
* Title: 服务器信息
*
* @author Fking<fsyvip666 @ gmail.com>
* @since 2022/1/7
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public static class ServerInfo {
//用户名
private String userName;
//计算机名
private String computerName;
//计算机域名
private String computerDomain;
//本机ip
private String serverIp;
//本机主机名
private String hostName;
//用户的主目录
private String userHome;
//用户的当前工作目录
private String userDir;
}
/**
* Title: 系统信息
*
* @author Fking<fsyvip666 @ gmail.com>
* @since 2022/1/7
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public static class SystemInfo {
//操作系统名称
private String vendorName;
//内核构架
private String arch;
//操作系统的描述
private String description;
//操作系统的版本号
private String version;
}
/**
* Title: CPU信息
*
* @author Fking<fsyvip666 @ gmail.com>
* @since 2022/1/7
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public static class CpuInfo {
//CPU的总量MHz
private int mhz;
//CPU的厂商
private String vendor;
//CPU型号类别
private String model;
//缓冲缓存数量
private long cacheSize;
//CPU的用户使用率
private double freqUser;
//CPU的系统使用率
private double freqSys;
//CPU的当前等待率
private double freqWait;
//CPU的当前错误率
private double freqNice;
//CPU的当前空闲率
private double freqIdle;
//CPU总的使用率
private double freqCombined;
}
/**
* Title: JVM信息
*
* @author Fking<fsyvip666 @ gmail.com>
* @since 2022/1/7
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public static class JvmInfo {
//JVM可以使用的总内存
private long totalMemory;
//JVM可以使用的剩余内存
private long freeMemory;
//JVM可以使用的处理器个数
private int availableProcessors;
//Java的运行环境版本
private String version;
//Java的运行环境供应商
private String vendor;
//Java的安装路径
private String home;
//Java运行时环境规范版本
private String specificationVersion;
//Java的类路径
private String classPath;
//Java加载库时搜索的路径列表
private String libraryPath;
//默认的临时文件路径
private String tmpdir;
//扩展目录的路径
private String dirs;
}
/**
* Title: 内存信息
*
* @author Fking<fsyvip666 @ gmail.com>
* @since 2022/1/7
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public static class MemoryInfo {
//内存总量
private long memoryTotal;
//当前内存使用量
private long memoryUsed;
//当前内存剩余量
private long memoryFree;
//交换区总量
private long swapTotal;
//当前交换区使用量
private long swapUsed;
//当前交换区剩余量
private long swapFree;
}
}</code></pre></div></div><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1722918060968755973.png" /></div></div></div></figure><p>过程问题记录:</p><p>因为我电脑上java版本有很多个,1.8/11/17 放文件的时候放错了版本就出现了错误1:</p><p>org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library</p><p>提示我没有找到该文件进行监控。</p><p>这个时候咱们打印System.out.println(System.getProperties().getProperty("java.library.path"));</p><p>看看咱们的jdk装到了哪里,然后把文件放到对应的bin目录下面根据不同的系统对应放上。</p><p>这个问题就解决了,随之迎来了第二个问题,就是对应上之后当我在执行的时候又出现了另一个问题</p><p>错误2:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1722918061301571710.png" /></div></div></div></figure><p>这个问题是在Windows下Java 版本中 <code>1.8.0_131</code> 到 <code>1.8.0_241</code> 都适合, 在 jdk1.8.0_261 包括在内以及以上不适合</p><p>Windows下降低版本然后重新导入就可以了。至于Liunx下我还没有测试</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1722918061545866129.png" /></div></div></div></figure>