10

我目前正在寻找性能。为了测量吞吐量,并强制我们不回归,我使用了很棒的 JMH。

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

虽然 JMH 分析器可以帮助进行分析,但我认为它们不能替代正确的分析。例如,“堆栈”分析器可以很好地浏览配置文件,但不适用于严肃的工作。

运行工作负载更长时间,并将您选择的分析器附加到正在运行的 VM。

我偷偷地希望我可以从命令行调整 JMH 测试,然后将类似 visualvm 的东西附加到它上面……但到目前为止,我已经能够让它工作。我想这是个坏主意?如果我可以共享我用来分析的代码以及我用来执行的代码,那将是理想的。

4

3 回答 3

5

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

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

以下是开始基准测试并使用它的方法(完整示例):

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 插件来监控/趋势基准测试结果/构建,如果观察到任何降级,我可以使用基准配置文件来调查潜在原因。

于 2016-06-16T11:21:51.597 回答
5

这不是一个坏主意。附加的实际方式取决于外部分析器支持的内容。

  • 如果分析器可以在分析下启动 Java 进程(例如,像 Solaris Studio 性能分析器的collect),那么执行 my-awesome-profiler java -jar benchmarks.jar将使您成功。但是请注意,JMH 分叉了运行工作负载的新进程。确保分析器能够捕获子进程。

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

嵌入式 JMH 分析器的优势在于它们准确地知道何时附加(另外,忽略哪些预热数据)。

于 2016-05-05T20:30:57.787 回答
2

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

于 2016-05-13T15:28:46.207 回答