2014-02-19 30 views
3

我有一大套使用不同的执行引擎,测量各种模拟的执行时间macrobenchmarks的(其中有些是严重的多线程)。这些职位大部分的使用,我在抽象基类指定为江铃控股有限公司的设置:江铃控股基准之间挂起(无法杀死分叉JVM?)

@ContextConfiguration(value = AbstractJobExecutorBenchmarker.CONTEXT_LOCATION) 
@State(Scope.Benchmark) 
@Fork(1) 
@BenchmarkMode(Mode.SingleShotTime) 
@Warmup(iterations = 1, timeUnit = TimeUnit.MILLISECONDS) 
@Measurement(iterations = 5, timeUnit = TimeUnit.MILLISECONDS) 
public abstract class AbstractJobExecutorBenchmarker extends AbstractTestNGSpringContextTests 

(我还加-GC -si假命令行)

当我火了这些基准测试中的任意单个或一些小子集,它都可以正常工作。然而,如果我试图一次性运行所有这些选项(即没有过滤选项),jmh成功完成了其中的几个,然后在一个特定的基准测试后突然发出freeses ... alli terations完成,最终结果被打印,但它看起来不像分叉JVM被杀死,新的不开始,似乎整个过程被阻塞。最后陈述的例子:

Iteration 3: 03:59:52.059 [pool-8-thread-1] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.059 [pool-8-thread-3] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.060 [pool-8-thread-5] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.060 [pool-8-thread-6] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.061 [pool-8-thread-7] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.061 [pool-8-thread-8] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.061 [pool-8-thread-9] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.061 [pool-8-thread-10] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.062 [pool-8-thread-13] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.062 [pool-8-thread-14] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.063 [pool-8-thread-15] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.063 [pool-8-thread-18] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.063 [pool-8-thread-19] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.064 [pool-8-thread-20] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.064 [pool-8-thread-22] INFO MessageTrafficController: Starting MessageTrafficController 
03:59:52.065 [pool-8-thread-25] INFO MessageTrafficController: Starting MessageTrafficController 
04:00:57.600 [pool-8-thread-6] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.601 [pool-8-thread-7] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.604 [pool-8-thread-13] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.604 [pool-8-thread-10] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.603 [pool-8-thread-8] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.604 [pool-8-thread-9] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.606 [pool-8-thread-22] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.608 [pool-8-thread-25] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.606 [pool-8-thread-20] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.605 [pool-8-thread-15] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.606 [pool-8-thread-19] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.606 [pool-8-thread-18] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
04:00:57.604 [pool-8-thread-14] WARN MessageTrafficController: Stopped due to class java.lang.InterruptedException 
65598.920 ms 

Result : 76749.529 Âą(99.9%) 804946.698 ms 
    Statistics: (min, avg, max) = (39272.712, 76749.529, 125376.954), stdev = 44121.845 
    Confidence interval (99.9%): [-728197.169, 881696.226] 

如果我手动杀死了分叉的JVM,整个过程都会被取消阻塞。然而,在完成下一个基准测试后,它会再次陷入困境......任何想法为何会发生?为什么当我单独启动相同的基准时不会发生?

此外,有没有在江铃控股一些超时选项,所以它杀死派生进程强行如果正常关机时间过长?

回答

2

这已在JMH dev mailing list上得到解答:您需要调试您的工作负载以禁止杂散线程,挂钩等阻止分叉虚拟机退出。

+0

这是正确的,我遵循了你的建议,并使用jstack发现我的一个线程正忙着在我们正在使用的库中旋转。 因为我无法对第三方代码做太多的工作,所以我将ExecutorService的创建线程设置为deamons,并解决了这个问题。 – Kranach