JMH 1.33是否支持JDK 17?调用时依赖sun.misc.Unsafe该如何解决
JDK17环境下运行JMH 1.33报错的解决方案
根因说明
JDK9引入的Java模块系统默认限制了sun.misc.Unsafe等JDK内部API的访问权限,JMH 1.33版本仍依赖该类实现部分底层逻辑,因此直接在JDK17下运行会触发访问权限报错。
方案1:升级JMH版本(优先推荐)
1.33并非JMH的最新稳定版本,后续发布的1.34及以上版本已完成JDK17+的适配,移除了对受限内部API的强制依赖,无需额外配置即可正常运行,且不会侵入你的基准测试代码,也不影响JDK17新增API的测试逻辑。
你只需修改pom.xml中jmh.version属性值即可:
<jmh.version>1.37</jmh.version>
修改后刷新Maven依赖、重新构建项目即可解决sun.misc.Unsafe访问报错问题。
方案2:保留JMH 1.33版本,配置JVM权限参数
如果有特殊场景必须使用1.33版本,可以通过JVM参数放开对应内部包的访问权限,有两种配置方式:
- 直接在启动代码的Options中追加参数,修改后的main方法代码如下:
public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(QuadPointBenchmark.class.getName()) .warmupTime(TimeValue.seconds(10)) .detectJvmArgs() // 新增JVM权限参数 .jvmArgsAppend("--add-opens", "java.base/sun.misc=ALL-UNNAMED") .jvmArgsAppend("--add-opens", "java.base/jdk.internal.misc=ALL-UNNAMED") .mode(Mode.AverageTime) .timeUnit(TimeUnit.NANOSECONDS) .build(); new Runner(opt).run(); }
- 若通过jar包直接运行,可在启动命令中追加参数:
java --add-opens java.base/sun.misc=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED -jar benchmarks.jar
内容的提问来源于stack exchange,提问作者Dyllon Gagnier
相关产品推荐
相关产品推荐

