使用JMH遇到transport error 202连接拒绝问题求助
JMH运行时JDWP连接拒绝错误(AGENT_ERROR_TRANSPORT_INIT)的解决方法
错误原因
当JMH通过forks(1)启动新的测试VM时,会默认继承当前运行环境的JDWP调试参数。新VM尝试连接调试端口时,要么端口被当前VM占用,要么没有调试器监听该端口,从而触发Connection refused和AGENT_ERROR_TRANSPORT_INIT错误。在GraalVM 11 + Gradle 6.8.3的组合下,这种参数继承行为会直接导致问题。
解决方案
方法1:修改JMH配置,禁用调试参数传递
在OptionsBuilder中添加参数,强制关闭JMH的调试传递行为:
public static void main (String[] args) throws RunnerException { var opt = new OptionsBuilder() .include(Sample_helloworld.class.getName()) .forks(1) .jvmArgs("-Djmh.debug.disable=true") // 关键配置 .build() ; new Runner(opt).run() ; }
方法2:在Gradle中移除调试VM参数
如果通过Gradle的run任务启动测试,修改Gradle配置,从Java执行任务中移除调试相关的参数:
tasks.withType(JavaExec) { jvmArgs.removeAll { it.startsWith("-agentlib:jdwp") } }
方法3:临时关闭fork模式(不推荐)
将forks(1)改为forks(0),让JMH直接在当前VM运行测试。但这种方式会影响基准测试的准确性(当前VM的运行状态会干扰测试结果),仅用于临时排查问题:
var opt = new OptionsBuilder() .include(Sample_helloworld.class.getName()) .forks(0) // 不启动新VM .build() ;
验证
修改配置后重新运行测试,若控制台不再输出transport error 202和AGENT_ERROR_TRANSPORT_INIT相关日志,说明问题解决。
内容的提问来源于stack exchange,提问作者L Jackie
相关产品推荐
相关产品推荐

