前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取系统信息

获取系统信息

作者头像
阿超
发布2022-08-16 19:02:20
1.8K0
发布2022-08-16 19:02:20
举报
文章被收录于专栏:快乐阿超

人不读书,则尘俗生其间,照镜则面目可憎,对人则语言无味。一一北宋·黄庭坚

首先是依赖

代码语言:javascript
复制
<!-- 获取系统信息 -->
<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>3.9.1</version>
</dependency>

然后是工具类

代码语言:javascript
复制
package com.ruben.utils.server;

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * 服务器信息
 *
 * @author Administrator
 */
public class ServerOsInfo {


    public static ServerInfo getInfo() {
        ServerInfo info = new ServerInfo();
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        CentralProcessor processor = hal.getProcessor();  //获取cpu信息
        info.setCpu(setCpuInfo(processor));
        GlobalMemory memory = hal.getMemory();  //获取内存信息
        info.setMem(setMemInfo(memory));
        info.setSys(setSysInfo()); //服务器信息
        info.setJvm(setJvmInfo()); //jvm信息
        OperatingSystem op = si.getOperatingSystem();
        info.setFile(setSysFiles(op)); //磁盘信息
        info.setIp(getHostIp());
        info.setHostname(getHostName());
        return info;
    }

    /*
     * cpu信息
     *
     * @param processor
     */
    private static ServerInfo.Cpu setCpuInfo(CentralProcessor processor) {   // CPU信息
        long[] prevTicks = processor.getSystemCpuLoadTicks();
        Util.sleep(1000);
        long[] ticks = processor.getSystemCpuLoadTicks();
        double nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
        double irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
        double softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
        double steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
        /*
         * CPU系统使用率
         */
        double sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
        /*
         * CPU用户使用率
         */
        double used = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
        /*
         * CPU当前等待率
         */
        double iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
        /*
         * CPU当前空闲率
         */
        double free = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
        /*
         * CPU总的使用率
         */
        double total = used + nice + sys + free + iowait + irq + softirq + steal;

        /*
         * 核心数
         */
        int cpuNum = processor.getLogicalProcessorCount();

        /*
         * CPU当前等待率
         */

        ServerInfo.Cpu cpu = new ServerInfo.Cpu();
        cpu.setCpucard(processor);//cpu信息
        cpu.setNum(cpuNum);//cpu核心数
        cpu.setUsed(round(mul((sys + used) / total, 100), 2));//cpu 用户使用率;
        cpu.setFree(round(mul(free / total, 100), 2));//cpu 空闲率
        return cpu;
    }

    /**
     * 内存信息
     */
    private static ServerInfo.MemoryInfo setMemInfo(GlobalMemory memory) {
        /*
         * 内存总量
         */
        double total = +memory.getTotal();

        /*
         * 已用内存
         */
        double used = memory.getTotal() - memory.getAvailable();

        /*
         * 剩余内存
         */
        double free = memory.getAvailable();
        ServerInfo.MemoryInfo mem = new ServerInfo.MemoryInfo();
        mem.setTotal(div(total, (1024 * 1024 * 1024), 2));// 内存总大小
        mem.setUsedMem(div(used, (1024 * 1024 * 1024), 2));// 已使用内存大小
        mem.setFree(round(mul(free / total, 100), 2));// 剩余内存大小
        mem.setUsed(round(mul(used / total, 100), 2));
        return mem;
    }

    /*
     * 服务器信息
     */
    private static Properties setSysInfo() {
        return System.getProperties();
    }


    /*
     * Java虚拟机
     */
    private static ServerInfo.Jvm setJvmInfo() {
        ServerInfo.Jvm jvm = new ServerInfo.Jvm();
        jvm.setTotal(div(Runtime.getRuntime().totalMemory(), 1024 * 1024, 2));
        jvm.setMaxTotal(div(Runtime.getRuntime().maxMemory(), 1024 * 1024, 2));
        jvm.setUsedMem(div((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()), 1024 * 1024, 2));
        jvm.setUsed(round(mul((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) * 1.0 / Runtime.getRuntime().totalMemory(), 100), 2));
        return jvm;
    }

    /*
     * 设置磁盘信息
     */
    private static List<ServerInfo.FileItem> setSysFiles(OperatingSystem os) {
        FileSystem fileSystem = os.getFileSystem();
        OSFileStore[] fsArray = fileSystem.getFileStores();
        List<ServerInfo.FileItem> list = new ArrayList<>();
        for (OSFileStore fs : fsArray) {
            long free = fs.getUsableSpace();
            long total = fs.getTotalSpace();
            long used = total - free;
            ServerInfo.FileItem fileItem = new ServerInfo.FileItem();
            fileItem.setPath(fs.getMount());
            fileItem.setType(fs.getType());
            fileItem.setName(fs.getName());
            fileItem.setTotal(convertFileSize(total));
            fileItem.setFree(convertFileSize(free));
            fileItem.setUsed(convertFileSize(used));
            fileItem.setRate(div(used, total, 4) * 100);
            list.add(fileItem);
        }
        return list;
    }

    /*
     * 字节转换
     *
     * @param size 字节大小
     * @return 转换后值
     */
    public static String convertFileSize(long size) {
        long kb = 1024;
        long mb = kb * 1024;
        long gb = mb * 1024;
        if (size >= gb) {
            return String.format("%.1f GB", (float) size / gb);
        } else if (size >= mb) {
            float f = (float) size / mb;
            return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
        } else if (size >= kb) {
            float f = (float) size / kb;
            return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
        } else {
            return String.format("%d B", size);
        }
    }

    /*
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        return ((double) ((int) (v1 / v2 * Math.pow(10, scale)))) / Math.pow(10, scale);

    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    public static String getHostIp() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException ignored) {
        }
        return "127.0.0.1";
    }

    public static String getHostName() {
        try {
            return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException ignored) {
        }
        return "未知";
    }

    public static void main(String[] args) {
        System.out.println(div(19, 7, 4));
        System.out.println(getInfo());
    }
}

运行main结果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档