是否可以在外部分析器下运行JMH基准测试?

时间:2016-04-23 05:25:49

标签: java performance-testing visualvm jmh yourkit

我现在正在寻找表演。为了衡量吞吐量,并强制我们不退步,我正在使用精彩的JMH。

当我遇到一些缓慢的事情时,我想开始分析以查看发生了什么,根据JMH的作者this link写道:

  

虽然JMH剖析器可以提供分析方面的帮助,但我认为不是   是正确剖析的替代品。例如。 “堆栈”分析器是   很高兴看一下配置文件,但不是认真的工作。

     

运行工作负载更长时间,并将您选择的探查器附加到   运行VM。

我暗中希望我可以从命令行调整JMH测试,然后附加像visualvm这样的东西......但到目前为止我已经能够让它工作了。我想这是个坏主意?如果我可以共享我用于配置文件的代码以及我用来强制执行的代码,那将是理想的。

3 个答案:

答案 0 :(得分:2)

这不是一个坏主意。实际的连接方式取决于外部探查器支持的内容。

  • 如果探查器可以在分析下启动Java进程(例如 Solaris Studio性能分析器的collect),然后执行 my-awesome-profiler java -jar benchmarks.jar会让你中途停下来 那里。但请注意,JMH分配了新的流程 工作负载运行。确保探查器能够抓住孩子 过程

  • 如果探查器附加到正在运行的进程,则查找子进程并附加到该进程。这个过程会有一个有说服力的名字,比如...ForkedMain。 VisualVM应该能够在运行的JVM列表中列出它,并且可以毫无问题地附加到它。您可以jps为其他分析器附加PID。需要注意的是延长运行时间,因此您将有更多时间来附加。增加迭代时间/计数来做到这一点。

嵌入式JMH分析器在确切知道何时附加(以及要忽略的预热数据)方面表现良好。

答案 1 :(得分:2)

是的,这是可能的,这很简单,我推荐它作为最佳做法一直这样做!有数据可用于解释正在发生的事情,而无需花费额外的时间来重现问题,这总是很好。

我编写了自己的JMH探查器来使用JFR(Java Flight Recorder):JmhFlightRecorderProfiler,它将启动JMH分析并在基准测试结束时将数据保存到文件中。您可以使用JDK附带的Java Mission控件打开此文件。

以下是启动基准测试并使用它的方法(complete example):

Options opt = new OptionsBuilder()
        .include(".*")
        .addProfiler(JmhFlightRecorderProfiler.class)
        .jvmArgs("-Xmx256m", "-Xms256m", "-XX:+UnlockCommercialFeatures",
                "-Djmh.stack.profiles=" + destinationFolder,
                "-Djmh.executor=FJP",
                "-Djmh.fr.options=defaultrecording=true,settings=" + profile)
        .result(destinationFolder + "/" + "benchmarkResults.csv")
        .resultFormat(ResultFormatType.CSV)
        .warmupIterations(10)
        .measurementIterations(10)
        .forks(1)
        .build();
 new Runner(opt).run();

我在标准构建期间运行基准测试,我使用Jenkins JMH plugin来监控/趋势基准测试结果/构建,如果观察到任何降级,我可以使用Benchmark profiles来调查潜在原因。

答案 2 :(得分:1)

您可以通过添加" -agentpath"来运行YourKit性能分析代理。 JVM选项。请在此处查看详细信息https://www.yourkit.com/docs/java/help/agent.jsp

相关问题