我正在尝试测量JVM代理对性能的影响,以确保它不会使我们试图运行的测试无效(也许可以从生产环境中取一些样本)。这个案例是一组BTrace脚本,在自动化负载测试期间运行,但问题可能适用于任何代理。
为了运行基准测试,我设置了一个小的JMH项目,并将代理附加为:
java -javaagent:/home/ssube/btrace/build/btrace-agent.jar=scriptdir=/home/ssube/btrace/scripts/,port=0 -jar benchmarks.jar
每次JVM被JMH分叉时,都会出现以下错误:
# 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基准测试中,并捕获由代理引起的性能差异?
@Fork
注释中测试时,无需指定任何jvmArgs,使用各种fork计数; 现在似乎一切都正常工作。请注意,BTrace确实需要指定port = 0
,否则每个fork都会尝试绑定到默认端口并失败。 - ssube