前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用sigar获取本机 服务器、系统、CPU、JVM、内存信息

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

原创
作者头像
Java king
发布2023-02-21 18:12:25
6K0
发布2023-02-21 18:12:25
举报
文章被收录于专栏:后端Java

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

周六在家闲来无事学习了一下利用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依赖

代码语言:java
复制
        <dependency>
            <groupId>org.fusesource</groupId>
            <artifactId>sigar</artifactId>
            <version>1.6.4</version>
        </dependency>
代码语言:java
复制
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;
    }
}

过程问题记录:

因为我电脑上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下我还没有测试

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档