使用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
相关产品推荐
相关产品推荐

