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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:54:01