You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OSHI API遭遇NoSuchMethodError问题求助

OSHI API运行报错排查与解决

问题背景

使用OSHI API时出现两类问题:SLF4J日志绑定警告,以及java.lang.NoSuchMethodError: 'void com.sun.jna.Memory.close()'运行时错误,添加SLF4J依赖后未解决。

Maven依赖配置

当前项目的Maven依赖如下:

<!-- OSHI核心依赖 -->
<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.2.2</version>
</dependency>
<!-- SLF4J API -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
<!-- SLF4J Simple实现 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.36</version>
    <scope>test</scope>
</dependency>

代码实现

使用OSHI的代码如下:

package controller;

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;

public class SystemLoad extends Thread {

    public SystemLoad() {
    }

    @Override
    public void run(){
        while(true) {
            SystemInfo si = new SystemInfo();
            HardwareAbstractionLayer hal = si.getHardware();
            CentralProcessor cpu = hal.getProcessor();
            System.out.println( String.valueOf(cpu.getSystemCpuLoad(100)) );
        }
    }
}

错误信息

运行时收到以下错误:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "Thread-0" java.lang.NoSuchMethodError: 'void com.sun.jna.Memory.close()'
    at com.github.oshi@6.2.2/oshi.util.Util.freeMemory(Util.java:112)
    at com.github.oshi@6.2.2/oshi.jna.ByRef$CloseableLONGLONGByReference.close(ByRef.java:101)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfDataUtil.updateQueryTimestamp(PerfDataUtil.java:174)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterQueryHandler.updateQuery(PerfCounterQueryHandler.java:134)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValuesFromPDH(PerfCounterWildcardQuery.java:164)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValues(PerfCounterWildcardQuery.java:87)
    at com.github.oshi@6.2.2/oshi.driver.windows.perfmon.ProcessorInformation.queryProcessorCounters(ProcessorInformation.java:167)
    at com.github.oshi@6.2.2/oshi.hardware.platform.windows.WindowsCentralProcessor.queryProcessorCpuLoadTicks(WindowsCentralProcessor.java:349)
    at com.github.oshi@6.2.2/oshi.util.Memoizer$1.get(Memoizer.java:87)
    at com.github.oshi@6.2.2/oshi.hardware.common.AbstractCentralProcessor.getProcessorCpuLoadTicks(AbstractCentralProcessor.java:204)
    at com.github.oshi@6.2.2/oshi.hardware.platform.windows.WindowsCentralProcessor.querySystemCpuLoadTicks(WindowsCentralProcessor.java:221)
    at com.github.oshi@6.2.2/oshi.util.Memoizer$1.get(Memoizer.java:87)
    at com.github.oshi@6.2.2/oshi.hardware.common.AbstractCentralProcessor.getSystemCpuLoadTicks(AbstractCentralProcessor.java:192)
    at com.github.oshi@6.2.2/oshi.hardware.CentralProcessor.getSystemCpuLoad(CentralProcessor.java:189)
    at hu.jhasher/controller.SystemLoad.run(SystemLoad.java:24)
    Suppressed: java.lang.NoSuchMethodError: 'void com.sun.jna.Memory.close()'
        at com.github.oshi@6.2.2/oshi.util.Util.freeMemory(Util.java:112)
        at com.github.oshi@6.2.2/oshi.jna.ByRef$CloseableHANDLEByReference.close(ByRef.java:115)
        at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterQueryHandler.removeAllCounters(PerfCounterQueryHandler.java:112)
        at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterQueryHandler.close(PerfCounterQueryHandler.java:166)
        at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValuesFromPDH(PerfCounterQueryHandler.java:146)
        ... 10 more

解决办法

1. 修复SLF4J日志绑定问题

当前slf4j-simple的scope设为test,仅在测试环境生效,主程序运行时无法找到日志实现。需移除scope标签,让其在运行时也能被加载:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.36</version>
</dependency>

2. 修复JNA版本不兼容问题

NoSuchMethodError源于OSHI 6.2.2依赖的JNA版本与项目实际使用版本不匹配,该版本OSHI需要JNA 5.12.1及以上版本。可显式添加JNA依赖:

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.12.1</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.12.1</version>
</dependency>

3. 优化代码逻辑

循环内重复创建SystemInfo实例会频繁占用资源,建议将初始化逻辑移到循环外,并添加休眠避免过度占用CPU:

package controller;

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;

public class SystemLoad extends Thread {

    private final SystemInfo si;
    private final CentralProcessor cpu;

    public SystemLoad() {
        si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        cpu = hal.getProcessor();
    }

    @Override
    public void run(){
        while(true) {
            System.out.println(String.valueOf(cpu.getSystemCpuLoad(100)));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Thend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:45:11