JMH分叉,线程和调试

时间:2017-03-09 14:59:09

标签: java jmh

我最近开始与JMH合作,并想知道是否有可能的方法来调试它。

我做的第一件事就是尝试像其他任何程序一样调试它,但它抛出"没有传输初始化",所以我无法以老式的方式调试它。

接下来我做的是尝试在互联网上搜索并找到一个人说你需要把叉子放到0,尝试它并且它有效。

不幸的是,我无法理解为什么叉子会影响调试,或者叉子如何影响我在JMH中看到事物的方式。 到目前为止,我所知道的是,当您在OptionBuilder上放置.forks(数字)时,它会说明基准测试将运行多少进程。但是如果我把.forks(3)它在3进程异步上运行每个@Benchmark方法?

有关.forks(数字),.threads(数字)的说明,它们如何改变基准测试的运行方式以及它们如何影响调试,这些都可以解决问题。

2 个答案:

答案 0 :(得分:5)

因此,正常的JMH运行在任何给定时间都有两个进程在运行。第一个(“主机”)进程处理运行。第二个(“分叉”)过程是运行给定基准的一个试验的过程 - 实现隔离。通过注释或命令行(优先于注释)请求N个分叉,可以对分叉进程进行N次连续调用。请求零分支在托管进程本身中直接运行工作负载。

因此,调试有两个方面:

a)通常,您可以附加到分叉进程,并在那里进行调试。它有助于将工作负载配置为运行更长时间,以便有足够的时间来附加和环顾四周。分叉流程通常以ForkedMain为切入点,在jps中可见。

b)如果上述内容不起作用,请询问-f 0,并附加到主机进程本身。

答案 1 :(得分:1)

这对工作很软,这很痛苦(现在我已经写了,听起来很琐碎)

首先,我尝试使用user_id调试DTraceAsmProfilerperfasm,但对于Mac)。

首先,我有一个名为gradle的gradle任务,看起来像这样:

jmh

然后我需要在task jmh(type: JavaExec, dependsOn: jmhClasses) { // the actual class to run main = 'com.eugene.AdditionPollution' classpath = sourceSets.jmh.compileClasspath + sourceSets.jmh.runtimeClasspath // I build JMH from sources, thus need this repositories { mavenLocal() maven { url '/Users/eugene/.m2/repository' } } } 中创建一个调试配置(没什么异常):

enter image description here

然后只需运行:

Intellij