我现在正在寻找表演。为了衡量吞吐量,并强制我们不退步,我正在使用精彩的JMH。
当我遇到一些缓慢的事情时,我想开始分析以查看发生了什么,根据JMH的作者this link写道:
虽然JMH剖析器可以提供分析方面的帮助,但我认为不是 是正确剖析的替代品。例如。 “堆栈”分析器是 很高兴看一下配置文件,但不是认真的工作。
运行工作负载更长时间,并将您选择的探查器附加到 运行VM。
我暗中希望我可以从命令行调整JMH测试,然后附加像visualvm这样的东西......但到目前为止我已经能够让它工作了。我想这是个坏主意?如果我可以共享我用于配置文件的代码以及我用来强制执行的代码,那将是理想的。
答案 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