Gradle项目中JMH Setup方法执行但Benchmark方法未运行
解决JMH基准测试Setup执行但Benchmark不运行的问题
针对你遇到的Setup方法执行两次但@Benchmark方法未执行、报告为空的问题,可按以下步骤排查解决:
1. 确认JMH注解处理器配置正确
JMH依赖注解处理器生成基准测试的执行代码,即使其他子项目配置正常,也要确保当前子项目的build.gradle里正确声明了注解处理器依赖,且版本与jmh-core一致:
dependencies { implementation 'org.openjdk.jmh:jmh-core:1.37' // 替换为你实际使用的版本 annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.37' // 版本需与core完全匹配 }
若之前用compileOnly或其他方式声明处理器,改为annotationProcessor才能保证注解被正确解析处理。
2. 检查@Benchmark方法的参数有效性
确保Blackhole的导入路径是org.openjdk.jmh.infra.Blackhole,如果导错包,JMH会判定该方法不是有效基准测试方法,直接跳过执行。
3. 调整@Setup的执行级别(可选)
你看到Setup执行两次,是因为默认@Setup的级别是Level.Trial——每个预热(Warmup)或测量(Measurement)的迭代都会触发一次。如果希望整个基准测试生命周期只执行一次Setup,显式指定级别:
@Setup(Level.Benchmark) public void setupBenchmark() { System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); // ... }
4. 查看JMH详细运行日志
执行Gradle命令时添加--info参数,获取JMH的完整运行日志:
./gradlew :sub-project:jmh --info
日志中会明确显示JMH是否识别到你的Benchmark方法,是否存在编译错误、生成类缺失、依赖冲突等问题,这是定位根因的关键。
5. 验证SingleShotTime模式配置
Mode.SingleShotTime是单次执行模式,若怀疑模式配置有冲突,可临时切换为Mode.Throughput或Mode.AverageTime,看Benchmark方法是否能正常执行,以此排除模式本身的问题。
6. 清理缓存后重新构建
执行以下命令清理构建缓存并重新运行基准测试,避免编译缓存导致的代码不生效问题:
./gradlew :sub-project:clean :sub-project:jmh
内容的提问来源于stack exchange,提问作者Steven Wu
相关产品推荐
相关产品推荐

