После написания моего поста «Как обнаружить и диагностировать медленный код в работе» читатель посоветовал мне попробовать jHiccup из систем Azul .
В прошлом году я пошел на лекцию создателя jHiccup Гила Тене о правильном способе измерения задержки, где, среди прочего, он познакомил нас с jHiccup. Это было в моем списке продуктов для расследования, и это дало мне импульс, чтобы наконец продолжить мое расследование.
JHiccup измеряет задержку системы сверх фактического программного кода. Например, время GC и другие события ОС и оборудования, которые добавляют скачки задержки для бесперебойной работы вашей программы. Это важно понимать, потому что ваша программа никогда не может иметь лучшие задержки, чем базовая среда, в которой она работает.
Короче говоря, я люблю инструмент и думаю, что он будет очень полезен для меня сейчас, когда я начал его использовать. Этот пост не о том, чтобы рассказать вам все о jHiccup, я отсылаю вас к документации для этого. Этот пост является «руководством по jHiccup», чтобы показать вам, как я его запустил, и надеюсь, что у вас появился аппетит попробовать его в своем собственном коде.
Шаг 1: Скачать продукт
Загрузите код, он с открытым исходным кодом, и вы можете получить его здесь . Разархивируйте файл, и вы увидите jHiccup.jar, который мы будем использовать на следующем шаге.
Шаг 2: Запустите вашу программу с помощью jHiccup
Есть несколько способов запустить jHiccup, но я так и сделал. Все, что вам нужно сделать, это добавить эту опцию vm в вашу командную строку:
1
|
-javaagent:jHiccup.jar= "-d 0 -i 1000 -l hiccuplog -c" |
Существует множество конфигураций, выбранные здесь означают:
-
-d
Задержка, до которой начинается задержка записи — это позволяет игнорировать любой период прогрева кода. (по умолчанию через 30 с) -
-i
Интервал данных, как часто данные записываются. (по умолчанию каждые 5 секунд) -
-l
Имя файла журнала, в который записываются данные. -
-c
Запускает управляющую JVM и записывает данные в logFile.c. Супер полезно сравнить с реальной программой, чтобы увидеть, было ли событие глобальным на машине.
Шаг 3: Обработка файла журнала
Запустите эту команду в файле журнала (вы можете обработать как файл журнала программы, так и файл журнала управления .c).
1
|
jHiccupLogProcessor -i hiccuplog -o myhlog |
В результате получается два файла, нас интересует один вызов myhlog (не myhlog.hgram), который мы будем использовать на последнем шаге.
Шаг 4. Создание графика в Excel
Теперь по-настоящему приятно. Откройте электронную таблицу jHiccupPlotter.xls и убедитесь, что вы включили макросы.
Вы увидите такой лист:
Просто выберите файл на шаге 3 и выберите заголовок диаграммы (это действительно полезная функция, когда вы начинаете сравнивать графики), и через несколько секунд у вас появятся графики распределения задержек.
пример
У меня была программа (не особенно чувствительная к задержкам), и я хотел понять, как различные сборщики мусора влияют на задержку.
Все, что мне нужно было сделать, это запустить мою программу с разными настройками сборщика мусора и сравнить графики. Конечно, это был слегка продуманный пример, который мне пришлось передать, но вы понимаете, легко изменить настройки или код jvm и получить сопоставимые результаты. Управляющая программа также важна для понимания того, что еще происходит на вашей машине, что может повлиять на задержку вашей программы.
Вот мои результаты: интересно посмотреть, как различные GC влияют на задержку, и это прекрасно демонстрируется с помощью jHiccup.
Используя серийный коллектор:
Используя коллектор G1:
Использование коллектора G1 — максимальная пауза установлена в 1 мс:
Использование сборщика CMS:
Используя параллельный GC:
Ссылка: | Начиная с jHiccup от нашего партнера по JCG Дэниела Шайя в блоге Rational Java . |