JMH зависает между тестами (невозможно убить разветвленную JVM?)

У меня есть большой набор макробенчмарков, которые измеряют время выполнения различных симуляций с использованием разных механизмов выполнения (некоторые из них сильно многопоточны). Большинство этих заданий используют настройки jmh, которые я указываю в абстрактном базовом классе как:

@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 false в командную строку)

Когда я запускаю один из этих тестов или какое-то небольшое подмножество, все работает нормально. Однако, если я попытаюсь запустить их все за один раз (то есть без параметров фильтрации), jmh успешно завершит несколько из них, а затем внезапно зависнет после одного конкретного теста ... не похоже, что разветвленная 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 вручную, весь процесс разблокируется. Однако после завершения следующего теста он снова застревает ... Есть идеи, почему это происходит? И почему этого НЕ происходит, когда я запускаю один и тот же бенчмарк по отдельности?

Кроме того, есть ли в JMH опция тайм-аута, чтобы он принудительно убивал разветвленный процесс, если нормальное завершение работы занимает слишком много времени?


person Kranach    schedule 19.02.2014    source источник


Ответы (1)


Ответ на этот вопрос уже есть в списке рассылки разработчиков JMH. : вам необходимо отладить рабочую нагрузку, чтобы запретить случайным потокам, перехватчикам и т. д. блокировать выход разветвленной виртуальной машины.

person Aleksey Shipilev    schedule 26.02.2014
comment
Правильно, я последовал вашему совету и использовал jstack, чтобы обнаружить, что один из моих потоков остался занятым в одной из библиотек, которые мы используем. Поскольку я ничего не мог поделать с этим сторонним кодом, я заставил мою ExecutorService создавать потоки как демоны, и это решило проблему. - person Kranach; 27.02.2014