使用sigar获取本机 服务器、系统、CPU、JVM、内存信息

腾讯云 2023-02-23 23:13:45

事业是栏杆,我们扶着它在深渊的边沿上走路。——高尔基《阿尔塔莫诺夫家的事业》


(相关资料图)

周六在家闲来无事学习了一下利用Sigar获取本机服务器、系统CPUJVM内存等信息

SigarHyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息

SigarCC#JavaPerl APIjava版的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依赖

            org.fusesource            sigar            1.6.4        
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 * @version 1.0.0 * @since 2022/1/5 18:53 */@Componentpublic class ServerUtil {    @SneakyThrows    public static ServerInfos getServerInfo() {        //服务器信息        Properties properties = System.getProperties();        Map 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 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();    }}~~~~~~javapackage 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 * @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;    private JvmInfo jvmInfo;    private MemoryInfo memoryInfo;    /**     * Title:  服务器信息     *     * @author Fking     * @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     * @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     * @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     * @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     * @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;    }}

过程问题记录:

因为我电脑上java版本有很多个,1.8/11/17 放文件的时候放错了版本就出现了错误1:

org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library

提示我没有找到该文件进行监控。

这个时候咱们打印System.out.println(System.getProperties().getProperty("java.library.path"));

看看咱们的jdk装到了哪里,然后把文件放到对应的bin目录下面根据不同的系统对应放上。

这个问题就解决了,随之迎来了第二个问题,就是对应上之后当我在执行的时候又出现了另一个问题

错误2:

这个问题是在Windows下Java 版本中 1.8.0_1311.8.0_241都适合, 在 jdk1.8.0_261 包括在内以及以上不适合

Windows下降低版本然后重新导入就可以了。至于Liunx下我还没有测试

x

热门推荐

理文造纸(2314.HK)上半年纯利按年跌57% 每吨净利润达到292港元

2022-08

啤酒行业高端化发展趋势凸显 力推中高端产品

2022-07

疫情后营业额翻四倍 多家小店迎来复苏

2022-05

强化优环境“软实力 赣州经开区助力企业走好绿色发展之路

2022-05

又有一家公司追锂 索通发展进军锂电材料领域胜算几

2022-05

海南推动农贸市场全面落实禁塑 加强违禁塑料制品源头治理

2021-12

柴犬登登拍卖记:动物是如何被司法拍卖的

2021-12

江西:到2025年鄱阳湖区断面水质优良比例达到50%以上

2021-12

西藏森林消防:锻造雪域救援尖兵 打造高海拔山岳救援队伍

2021-12

加强人才融通发展 第10届海峡两岸水利青年工程交流营成功举办

2021-12

推荐阅读

使用sigar获取本机 服务器、系统、CPU、JVM、内存信息

2023-02

全球讯息:食品gmp认证_关于食品gmp认证的介绍

2023-02

天天微头条丨违章停车是什么时候给交罚款

2023-02

中俄青年共同发布倡议:心手相连互学共进

2023-02

省公安厅与兰州老年大学开展“启新程·开新局·谱新篇”共建活动|当前消息

2023-02

世界观速讯丨属龙2023年桃花劫 悬挂五行八卦符化解

2023-02

环球聚焦:力盛体育:公司持续关注智能汽车技术的发展,目前暂无相关应用

2023-02

bartender软件下载地址_bar tender软件下载|天天日报

2023-02

解决中国违约债券的几种金融产品架构

2023-02

总投资约36.53亿元!台州温岭将新增一条快速路

2023-02