小

小南瓜

技术问题总结

  • 首页
Home Java使用oshi-core获取服务器、CPU、JVM、内存、磁盘等信息
文章

Java使用oshi-core获取服务器、CPU、JVM、内存、磁盘等信息

Posted 2024-11-29 Updated 2024-11- 29
By 小南瓜
19~25 min read

最近在弄后台管理系统,但由于功能不太多,准备弄个系统信息的界面来丰富下,经过查询,发现java中有oshi库可以很方便的获取系统信息。

oshi是什么

oshi是一个基于Java的开源库,它能够跨平台地获取操作系统、硬件和系统资源的信息。它利用底层操作系统的API,以统一的接口形式为Java应用程序提供详细的系统信息。无论是Windows、Linux还是macOS,oshi都能轻松应对,为用户提供丰富的系统监控数据。

如何使用

使用oshi非常简单,只需通过Maven进行依赖引入即可。

引入

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.6.5</version>
</dependency>

CPU相关信息

获取CPU的信息:核心数、使用率、等待率、空闲率等。

@Data

public class Cpu {

    /**

     * 核心数

     */

    private int cpuNum;

    /**

     * CPU总的使用率

     */

    private double total;

    /**

     * CPU系统使用率

     */

    private double sys;

    /**

     * CPU用户使用率

     */

    private double used;

    /**

     * CPU当前等待率

     */

    private double wait;

    /**

     * CPU当前空闲率

     */

    private double free;

    public double getTotal() {
        return ArithUtil.round(ArithUtil.mul(total, 100), 2);

    }

    public double getSys() {
        return ArithUtil.round(ArithUtil.mul(sys / total, 100), 2);

    }

    public double getUsed() {
        return ArithUtil.round(ArithUtil.mul(used / total, 100), 2);

    }

    public double getWait() {
        return ArithUtil.round(ArithUtil.mul(wait / total, 100), 2);

    }

    public double getFree() {
        return ArithUtil.round(ArithUtil.mul(free / total, 100), 2);

    }

}
HardwareAbstractionLayer hal = systemInfo.getHardware();
CentralProcessor processor = hal.getProcessor();
Cpu cpu = nwe Cpu();
long[] prevTicks = processor.getSystemCpuLoadTicks();
Util.sleep(OSHI_WAIT_SECOND);
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.setCpuNum(processor.getLogicalProcessorCount());
cpu.setTotal(totalCpu);
cpu.setSys(cSys);
cpu.setUsed(user);
cpu.setWait(iowait);
cpu.setFree(idle);

內存相关信息

获取内存信息:内存总量、已用内存、剩余内存。

@Data

public class Mem {

    /**

     * 内存总量

     */

    private double total;

    /**

     * 已用内存

     */

    private double used;

    /**

     * 剩余内存

     */

    private double free;

    public double getTotal() {
        return ArithUtil.div(total, (1024  1024  1024), 2);

    }

    public double getUsed() {
        return ArithUtil.div(used, (1024  1024  1024), 2);

    }

    public double getFree() {
        return ArithUtil.div(free, (1024  1024  1024), 2);

    }

    public double getUsage() {
        return ArithUtil.mul(ArithUtil.div(used, total, 4), 100);

    }

}
HardwareAbstractionLayer hal = systemInfo.getHardware();
GlobalMemory memory = hal.getMemory();
Mem men = new Mem();
mem.setTotal(memory.getTotal());
mem.setUsed(memory.getTotal() - memory.getAvailable());
mem.setFree(memory.getAvailable());

JVM相关信息

获取JVM的信息:JVM占用的内存总数、最大可用内存总数、空闲内存、版本、路径等。

@Data

public class Jvm {

    /**

     * 当前JVM占用的内存总数(M)

     */

    private double total;

    /**

     * JVM最大可用内存总数(M)

     */

    private double max;

    /**

     * JVM空闲内存(M)

     */

    private double free;

    /**

     * JDK版本

     */

    private String version;

    /**

     * JDK路径

     */

    private String home;

    public double getTotal() {

        return ArithUtil.div(total, (1024 * 1024), 2);

    }

    public double getMax() {

        return ArithUtil.div(max, (1024 * 1024), 2);

    }

    public double getFree() {

        return ArithUtil.div(free, (1024 * 1024), 2);

    }

    public double getUsed() {

        return ArithUtil.div(total - free, (1024 * 1024), 2);

    }

    public double getUsage() {

        return ArithUtil.mul(ArithUtil.div(total - free, total, 4), 100);

    }

    /**

     * 获取JDK名称

     */

    public String getName() {

        return ManagementFactory.getRuntimeMXBean().getVmName();

    }

    /**

     * JDK启动时间

     */

    public String getStartTime() {

        long time = ManagementFactory.getRuntimeMXBean().getStartTime();

        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time));

    }

    /**

     * JDK运行时间

     */

    public String getRunTime() {

        return getDatePoor(new Date(), new Date(ManagementFactory.getRuntimeMXBean().getStartTime()));

    }

    /**

     * 运行参数

     */

    public String getInputArgs() {
        return ManagementFactory.getRuntimeMXBean().getInputArguments().toString();

    }

    private String getDatePoor(Date endDate, Date nowDate) {
        long nd = 1000  24  60 * 60;
        long nh = 1000  60  60;
        long nm = 1000 * 60;
        long diff = endDate.getTime() - nowDate.getTime();
        long day = diff / nd;
        long hour = diff % nd / nh;
        long min = diff % nd % nh / nm;
        return day + "天" + hour + "小时" + min + "分钟";

    }

}
Jvm jvm = new Jvm();
Properties props = System.getProperties();
jvm.setTotal(Runtime.getRuntime().totalMemory());
jvm.setMax(Runtime.getRuntime().maxMemory());
jvm.setFree(Runtime.getRuntime().freeMemory());
jvm.setVersion(props.getProperty("java.version"));
jvm.setHome(props.getProperty("java.home"));

服务器相关信息

服务器的基本信息:名称、IP、操作系统、架构。

@Data

public class Sys {

    /**

     * 服务器名称

     */

    private String computerName;

    /**

     * 服务器Ip

     */

    private String computerIp;

    /**

     * 项目路径

     */

    private String userDir;

    /**

     * 操作系统

     */

    private String osName;

    /**

     * 系统架构

     */

    private String osArch;

}
Sys sys = new Sys();
Properties props = System.getProperties();
sys.setComputerName(IpUtils.getHostName());
sys.setComputerIp(IpUtils.getHostIp());
sys.setOsName(props.getProperty("os.name"));
sys.setOsArch(props.getProperty("os.arch"));
sys.setUserDir(props.getProperty("user.dir"));

磁盘相关信息

磁盘信息:盘符路径、大小等。

@Data

public class SysFile {

    /**

     * 盘符路径

     */

    private String dirName;

    /**

     * 盘符类型

     */

    private String sysTypeName;

    /**

     * 文件类型

     */

    private String typeName;

    /**

     * 总大小

     */

    private String total;

    /**

     * 剩余大小

     */

    private String free;

    /**

     * 已经使用量

     */

    private String used;

    /**

     * 资源的使用率

     */

    private double usage;

}
SystemInfo systemInfo = new SystemInfo();
List<SysFile> sysFiles = new ArrayList<>();
OperatingSystem os = systemInfo.getOperatingSystem();
FileSystem fileSystem = os.getFileSystem();
List<OSFileStore> fsArray = fileSystem.getFileStores();
for (OSFileStore fs : fsArray) {
    long free = fs.getUsableSpace();
    long total = fs.getTotalSpace();
    long used = total - free;
    SysFile sysFile = new SysFile();
    sysFile.setDirName(fs.getMount());
    sysFile.setSysTypeName(fs.getType());
    sysFile.setTypeName(fs.getName());
    sysFile.setTotal(convertFileSize(total));
    sysFile.setFree(convertFileSize(free));
    sysFile.setUsed(convertFileSize(used));
    sysFile.setUsage(ArithUtil.mul(ArithUtil.div(used, total, 4), 100));
    sysFiles.add(sysFile);
}

编程开发
springboot java
License:  CC BY 4.0
Share

Further Reading

Nov 29, 2024

Java使用oshi-core获取服务器、CPU、JVM、内存、磁盘等信息

最近在弄后台管理系统,但由于功能不太多,准备弄个系统信息的界面来丰富下,经过查询,发现java中有oshi库可以很方便的获取系统信息。 oshi是什么 oshi是一个基于Java的开源库,它能够跨平台地获取操作系统、硬件和系统资源的信息。它利用底层操作系统的API,以统一的接口形式为Java应用程序

Nov 14, 2024

Java PKIX SSL证书校验错误及解决方案

服务器上程序发起https请求时,有些时候会遇到下面的错误: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExcept

Feb 25, 2024

c++中string和wstring相互转换

string转wstring代码 wstring StringToWString(const string &amp;str) { int num = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0); wchar_t

OLDER

基于vue3、antvue、cropperjs轻松实现图片完美裁剪,打造个性化上传体验

NEWER

Recently Updated

  • Java使用oshi-core获取服务器、CPU、JVM、内存、磁盘等信息
  • 基于vue3、antvue、cropperjs轻松实现图片完美裁剪,打造个性化上传体验
  • Java PKIX SSL证书校验错误及解决方案
  • Centos升级openssl
  • 前端项目运行、打包是提示ERR_OSSL_EVP_UNSUPPORTED错误

Trending Tags

Halo C++ vite centos openssl java springboot vue 前端

Contents

©2025 小南瓜. Some rights reserved. 粤ICP备20020668号-1

Using the Halo theme Chirpy