本文介绍: 谈到监控,最快捷的还是使用Java本身进行对JVM和操作系统监控,方便快捷又可靠。OSHI(Operating System and Hardware Information)是Java免费基于JNA的(本机操作系统硬件信息库。它提供了一组简单易用的API,可以用于检索监控诸如操作系统类型处理器信息、内存使用情况、硬盘信息、网络接口系统硬件相关数据获取操作系统信息:可以获取操作系统名称版本构建信息、位数等。还可以获取操作系统启动时间系统负载当前进程数等信息。
属性 属性 类型 说明
manufacturer String 制造
model String 型号
serialNumber String 序列号
Firware 固件信息
name String 固件名称
version String 固件版本
describe String 固件描述
manufacturer String 制造商
releaseDate String 发行日期
Baseboard 主板信息
version String 主板版本
model String 模型
serialNumber String 序列号
manufacturer String 制造商

四、使用场景

4.1 获取 CPU 信息

  想要获取 CPU 信息,就需要CentralProcessor 类(中央处理器)作为参数oshi获取CentralProcessor步骤为:

  1. 首先实例内置SystemInfo类,该类用于访问系统硬件信息。

  2. 然后根据此类的内置方法获取硬件抽象层类 HardwareAbstractionLayer 类,主要用于硬件抽象化,允许计算机操作系统逻辑层而不是硬件层与硬件设备交互

  3. 最后根据HardwareAbstractionLayer类内置方法获取CentralProcessor 类,提供setCpuInfo方法参数

public static Map<String, Object> getCpuInfo() throws InterruptedException {
    HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
    Map<String, Object> cpuInfo = Maps.newHashMap();
    CentralProcessor processor = hardware.getProcessor();
    // 第一次获取:获取系统范围的 CPU 负载滴答计数器
    long[] prevTicks = processor.getSystemCpuLoadTicks();
    //等待一段时间
    java.lang.Thread.sleep(1000);
    //第二次获取:获取系统范围的 CPU 负载滴答计数器
    long[] ticks = processor.getSystemCpuLoadTicks();

    long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
    long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
    long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
    long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
    long ioWait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
    long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
    long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
    long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];

    long totalCpu = user + nice + cSys + idle + ioWait + irq + softIrq + steal;
    // cpu供应商
    cpuInfo.put("cpuVendor", processor.getProcessorIdentifier().getVendor());
    //  cpu名称
    cpuInfo.put("cpuName", processor.getProcessorIdentifier().getName());
    // CPU核心
    cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());
    // CPU总的使用率
    cpuInfo.put("totalPercent", totalCpu);
    // CPU用户使用率表示用户模式下花费的CPU时间
    cpuInfo.put("usedPercent", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
    // CPU当前等待率,表示等待I/O操作的进程所花费的CPU时间
    cpuInfo.put("waitPercent", new DecimalFormat("#.##%").format(ioWait * 1.0 / totalCpu));
    // CPU系统使用率,表示系统进程所花费的CPU时间
    cpuInfo.put("sysPercent", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
    //  CPU当前空闲率,表示空闲进程所花费的CPU时间
    cpuInfo.put("idlePercent", new DecimalFormat("#.##%").format(idle * 1.0 / totalCpu));
    // 表示在nice值为0~99之间进程所花费的CPU时间
    cpuInfo.put("nicePercent", new DecimalFormat("#.##%").format(nice * 1.0 / totalCpu));
    // 表示处理中断的进程所花费的CPU时间
    cpuInfo.put("irqPercent", new DecimalFormat("#.##%").format(irq * 1.0 / totalCpu));
    // 表示处理中断的进程所花费的CPU时间
    cpuInfo.put("softIrqPercent", new DecimalFormat("#.##%").format(softIrq * 1.0 / totalCpu));
    // 表示被其他线程“偷走”的CPU时间
    cpuInfo.put("stealPercent", new DecimalFormat("#.##%").format(steal * 1.0 / totalCpu));
    // 物理处理器数量
    cpuInfo.put("physicalProcessorCount", processor.getPhysicalProcessorCount());
    return cpuInfo;
}

4.2 获取内存信息

  想要获取内存信息,这就需要硬件抽象层类提供的GlobalMemory类作为参数通过GlobalMemory类的内置方法来获取内存信息。

public static Map<String, Object> getMemoryInfo() {
    HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
    GlobalMemory globalMemory = hardware.getMemory();
    Map<String, Object> gmMap = Maps.newHashMap();
    // 总内存
    gmMap.put("total", FormatUtil.formatBytes(globalMemory.getTotal()));
    // 剩余【当前可用的物理内存量】
    gmMap.put("available", FormatUtil.formatBytes(globalMemory.getAvailable()));
    // 已使用
    gmMap.put("used", FormatUtil.formatBytes(globalMemory.getTotal() - globalMemory.getAvailable()));
    // 空闲
    gmMap.put("freeRate", 100d * (globalMemory.getAvailable()) / globalMemory.getTotal());
    // 使用率
    gmMap.put("usageRate", 100d * (globalMemory.getTotal() - globalMemory.getAvailable()) / globalMemory.getTotal());
    gmMap.put("pageSize", globalMemory.getPageSize());

    VirtualMemory virtualMemory = globalMemory.getVirtualMemory();
    Map<String, Object> vmMap = Maps.newHashMap();
    vmMap.put("toString", virtualMemory);
    vmMap.put("swapTotal", FormatUtil.formatBytes(virtualMemory.getSwapTotal()));
    vmMap.put("swapUsed", FormatUtil.formatBytes(virtualMemory.getSwapUsed()));
    vmMap.put("swapUsageRate", 100d * virtualMemory.getSwapUsed() / virtualMemory.getSwapTotal());
    vmMap.put("virtualMax", FormatUtil.formatBytes(virtualMemory.getVirtualMax()));
    vmMap.put("virtualInUse", FormatUtil.formatBytes(virtualMemory.getVirtualInUse()));
    vmMap.put("virtualUsageRate", 100d * virtualMemory.getVirtualInUse() / virtualMemory.getVirtualMax());
    gmMap.put("virtualMemory", vmMap);

    List<PhysicalMemory> physicalMemoryList = globalMemory.getPhysicalMemory();
    List<Map<String, Object>> pmInfoList = new ArrayList<>(physicalMemoryList.size());
    for (PhysicalMemory pm : physicalMemoryList) {
        Map<String, Object> pmMap = Maps.newHashMap();
        pmMap.put("toString", String.valueOf(pm));
        pmMap.put("bankLabel", pm.getBankLabel());
        pmMap.put("manufacturer", pm.getManufacturer());
        pmMap.put("capacity", FormatUtil.formatBytes(pm.getCapacity()));
        pmMap.put("memoryType", pm.getMemoryType());
        pmMap.put("clockSpeed", FormatUtil.formatHertz(pm.getClockSpeed()));
        pmInfoList.add(pmMap);
    }

    gmMap.put("physicalMemoryList", pmInfoList);
    return gmMap;
}

4.3 获取服务器信息

  首先调用Java内置的System类的 getProperties() 方法,获取当前系统属性集,并作为一个Properties对象返回,并通过对该属性通过传参查询,得到操作系统名称、系统架构项目路径等信息。

public static Map<String, Object> getSysInfo() throws UnknownHostException {
    Map<String, Object> sysInfo = Maps.newHashMap();
    Properties props = System.getProperties();
    // 操作系统
    sysInfo.put("osName", props.getProperty("os.name"));
    // 系统架构
    sysInfo.put("osArch", props.getProperty("os.arch"));
    // 服务器名称
    sysInfo.put("computerName", InetAddress.getLocalHost().getHostName());
    // 服务器IP
    sysInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());
    // 项目路径
    sysInfo.put("userDir", props.getProperty("user.dir"));
    // 操作系统信息
    sysInfo.put("desktop", props.getProperty("sun.desktop"));
    return sysInfo;
}

4.4 获取Java虚拟机信息

  首先通过System系统类获取当前系统属性集后,使用Properties对象传参查询的得到JDK版本路径通过获得Java内置的RunTime对象每个Java应用程序都有一个单独的Runtime实例,它允许应用程序运行应用程序环境进行接口。当前运行可以从getRuntime方法中获得)获取Java虚拟机的总内存量、 Java 虚拟机试图使用的最大内存量、Java虚拟机中的可用内存量。

public static Map<String, Object> getJvmInfo() {
    Map<String, Object> jvmInfo = new ConcurrentHashMap<>();
    Properties props = System.getProperties();
    Runtime runtime = Runtime.getRuntime();
    long jvmTotalMemoryByte = runtime.totalMemory();
    long jvmFreeMemoryByte = runtime.freeMemory();
    long jvmUseMemoryByte = jvmTotalMemoryByte - jvmFreeMemoryByte;
    // jvm总内存
    jvmInfo.put("totalMemory", FormatUtil.formatBytes(jvmTotalMemoryByte));
    // JVM空闲内存
    jvmInfo.put("freeMemory", FormatUtil.formatBytes(jvmFreeMemoryByte));
    // Jvm已使用内存
    jvmInfo.put("usedMemory", FormatUtil.formatBytes(jvmUseMemoryByte));
    // JVM最大可用内存总数
    jvmInfo.put("maxMemory", FormatUtil.formatBytes(runtime.maxMemory()));
    // jvm内存使用率
    jvmInfo.put("useRate", new DecimalFormat("#.##%").format((jvmUseMemoryByte) * 1.0 / jvmTotalMemoryByte));
    // jvm内存空闲
    jvmInfo.put("freeRate", new DecimalFormat("#.##%").format((jvmFreeMemoryByte) * 1.0 / jvmTotalMemoryByte));
    // Java版本
    jvmInfo.put("jdkVersion", props.getProperty("java.version"));
    // jdk安装目录
    jvmInfo.put("jdkHome", props.getProperty("java.home"));
    // java类包的路径
    props.getProperty("java.class.path");
    //java虚拟机制造商
    props.getProperty("java.vm.vendor");
    // jdk bin目录
    props.getProperty("sun.boot.library.path");
    // java运行环境版本
    props.getProperty("java.runtime.version");
    // 依赖路径
    props.getProperty("java.library.path");
    // java制造商
    props.getProperty("java.vendor");
    // java虚拟机信息
    props.getProperty("java.vm.info");
    // java虚拟版本
    props.getProperty("java.vm.version");
    // java类版本
    props.getProperty("java.class.version");

    return jvmInfo;
}

4.5 获取系统文件相关信息

  首先通过 SystemInfo类获取当前平台操作系统的新实例,再根据 OperatingSystem.getFileSystem()方法实例化FileSystem对象,再通过 getFileStores() 获取本机文件存储实例化OSFileStore对象列表,表示存储池、设备分区、卷、具体的文件系统或其他实现特定的文件存储方法信息,该方法会返回OSFileStore对象列表最后遍历集合获取磁盘状态信息。

public static Map<String, Object> getFileSystemInfo() {
    Map<String, Object> fsInfo = new ConcurrentHashMap<>();
    FileSystem fileSystem = new SystemInfo().getOperatingSystem().getFileSystem();
    List<Map<String, Object>> fileSystemInfos = new ArrayList<>();
    // 打开文件描述符
    fsInfo.put("openFileDescriptors", fileSystem.getOpenFileDescriptors());
    // 最大文件描述符
    fsInfo.put("maxFileDescriptors", fileSystem.getMaxFileDescriptors());
    fsInfo.put("fileDescriptors", String.format("%d/%d", fileSystem.getOpenFileDescriptors(), fileSystem.getMaxFileDescriptors()));
    fsInfo.put("fdUsageRate", (100d * fileSystem.getOpenFileDescriptors() / fileSystem.getMaxFileDescriptors()) + "%");

    List<OSFileStore> fileStores = fileSystem.getFileStores();
    for (int i = 0; i < fileStores.size(); i++) {
        Map<String, Object> fileStoreInfo = Maps.newHashMap();
        fileStoreInfo.put("index", i);
        OSFileStore osFileStore = fileStores.get(i);
        // 磁盘名称
        fileStoreInfo.put("name", osFileStore.getName());
        // 文件系统的卷名
        fileStoreInfo.put("volume", osFileStore.getVolume());
        // 标签
        fileStoreInfo.put("label", osFileStore.getLabel());
        // 文件系统逻辑卷名
        fileStoreInfo.put("logicalVolume", osFileStore.getLogicalVolume());
        // 文件系统挂载
        fileStoreInfo.put("mount", osFileStore.getMount());
        // 说明
        fileStoreInfo.put("description", osFileStore.getDescription());
        // 盘符类型
        fileStoreInfo.put("sysTypeName", osFileStore.getType());
        // 文件系统选项
        fileStoreInfo.put("options", osFileStore.getOptions());
        fileStoreInfo.put("uuid", osFileStore.getUUID());

        fileStoreInfo.put("freeSpace", osFileStore.getFreeSpace());

        // 剩余大小
        fileStoreInfo.put("usableSpace", FormatUtil.formatBytes(osFileStore.getUsableSpace()));
        // 总大小
        fileStoreInfo.put("totalSpace", FormatUtil.formatBytes(osFileStore.getTotalSpace()));

        fileStoreInfo.put("freeInodes", FormatUtil.formatValue(osFileStore.getFreeInodes(), ""));
        fileStoreInfo.put("totalInodes", FormatUtil.formatValue(osFileStore.getTotalInodes(), ""));


        // 已经使用量
        fileStoreInfo.put("usedSpace", FormatUtil.formatBytes(osFileStore.getTotalSpace() - osFileStore.getUsableSpace()));


        // 使用率
        String usageRate = "0";
        if (osFileStore.getTotalSpace() > 0) {
            usageRate = new DecimalFormat("#.##%").format((osFileStore.getTotalSpace() - osFileStore.getUsableSpace()) * 1.0 / osFileStore.getTotalSpace());
        }
        fileStoreInfo.put("usageRate", usageRate);
        fileStoreInfo.put("inodesUsageRate", 100d * osFileStore.getFreeInodes() / osFileStore.getTotalInodes());

        fileSystemInfos.add(fileStoreInfo);
    }
    fsInfo.put("fileStores", fileSystemInfos);
    return fsInfo;
}

4.6 获取磁盘信息

public static List<Map<String, Object>> getDiskStoreInfo() {
    HardwareAbstractionLayer hardware = new SystemInfo().getHardware();
    List<HWDiskStore> diskStores = hardware.getDiskStores();
    List<Map<String, Object>> dsList = new ArrayList<>(diskStores.size());
    for (int i = 0; i < diskStores.size(); i++) {
        HWDiskStore hwDiskStore = diskStores.get(i);
        Map<String, Object> hwDsMap = new ConcurrentHashMap<>();
        hwDsMap.put("index", i);
        // 磁盘名称
        hwDsMap.put("name", hwDiskStore.getName());

        hwDsMap.put("currentQueueLength", hwDiskStore.getCurrentQueueLength());
        // 型号
        hwDsMap.put("model", hwDiskStore.getModel());
        // 序列号
        hwDsMap.put("serial", hwDiskStore.getSerial());
        // 大小
        hwDsMap.put("size", FormatUtil.formatBytes(hwDiskStore.getSize()));
        // 读长
        hwDsMap.put("reads", FormatUtil.formatBytes(hwDiskStore.getReads()));
        // 写长
        hwDsMap.put("writes", FormatUtil.formatBytes(hwDiskStore.getWrites()));
        // 读取字节
        hwDsMap.put("readBytes", hwDiskStore.getReadBytes());
        // 写入字节
        hwDsMap.put("writeBytes", hwDiskStore.getWriteBytes());
        // 转移时间
        hwDsMap.put("transferTime", hwDiskStore.getTransferTime());
        // 时间戳
        hwDsMap.put("timeStamp", hwDiskStore.getTimeStamp());

        List<HWPartition> partitions = hwDiskStore.getPartitions();
        List<Map<String, Object>> partitionList = new ArrayList<>(partitions.size());
        for (HWPartition partition : partitions) {
            Map<String, Object> partitionMap = Maps.newHashMap();
            // 分区大小
            partitionMap.put("size", FormatUtil.formatBytes(partition.getSize()));
            // 分区名称
            partitionMap.put("name", partition.getName());
            // 分区类型
            partitionMap.put("type", partition.getType());
            partitionMap.put("identification", partition.getIdentification());
            partitionMap.put("major", partition.getMajor());
            partitionMap.put("uuid", partition.getUuid());
            partitionMap.put("mountPoint", partition.getMountPoint());
            partitionMap.put("minor", partition.getMinor());
            partitionList.add(partitionMap);
        }
        hwDsMap.put("partitionList", partitionList);
        dsList.add(hwDsMap);
    }
    return dsList;
}

小结

今天最好的表现当作明天最新的起点..~

  投身于天地这熔炉,一个可以被毁灭,但绝不会被打败!一旦决定了心中所想,便绝无动摇。迈向光明之路,注定荆棘丛生,自己选择的路,即使再荒谬、再艰难,跪着也要走下去!放弃,曾令人想要逃离,但绝境重生方为宿命。若结果并非所愿,那就在尘埃落定前奋力一搏!

原文地址:https://blog.csdn.net/duleilewuhen/article/details/134696955

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41684.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注