我正在尝试衡量 JVM 代理对性能的影响,以确保它不会使我们尝试运行的测试无效(并可能为从 prod 中获取一些样本提供理由)。此案例是一组 BTrace 脚本,将在自动负载测试期间运行,但该问题可能对任何代理都是通用的。
为了运行基准测试,我建立了一个小型 JMH 项目并将代理附加为:
java -javaagent:/home/ssube/btrace/build/btrace-agent.jar=scriptdir=/home/ssube/btrace/scripts/,port=0 -jar benchmarks.jar
这样做会导致每次 JMH 派生 JVM 时出现以下错误:
# Run progress: 0.00% complete, ETA 00:02:00
# Fork: 1 of 1
Exception in thread "main" java.lang.IllegalArgumentException: org.openjdk.jmh.runner.options.CommandLineOptions; local class incompatible: stream classdesc serialVersionUID = 8906142321598115825, local class serialVersionUID = 7529911323947566771
at org.openjdk.jmh.runner.ForkedMain.main(ForkedMain.java:72)
<binary link had failed, forked VM corrupted the stream? Use EXTRA verbose to print exception>
<forked VM failed with exit code 1>
<stdout last='10 lines'>
</stdout>
<stderr last='10 lines'>
Exception in thread "main" java.lang.IllegalArgumentException: org.openjdk.jmh.runner.options.CommandLineOptions; local class incompatible: stream classdesc serialVersionUID = 8906142321598115825, local class serialVersionUID = 7529911323947566771
at org.openjdk.jmh.runner.ForkedMain.main(ForkedMain.java:72)
</stderr>
# VM invoker: /usr/java/jdk1.8.0_11/jre/bin/java
# VM options: -javaagent:/home/ssube/btrace/build/btrace-agent.jar=scriptdir=/home/ssube/btrace/scripts/,port=0
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.stackoverflow.questions.ShaderBench.testProcessProc
我的所有类都不是可序列化的,也没有serialVersionUID。JMH 基准测试在没有附加 BTrace 代理的情况下工作,代理和脚本在没有 JMH 的情况下工作。
(如何)您可以将 javaagent 附加到一组 JMH 基准测试并捕获由代理引起的性能差异吗?