JEP 167: Event-Based JVM Tracing
Трассировка JVM на основе событий
| Ответственный | Staffan Larsen |
| Тип | Feature |
| Область | JDK |
| Статус | Closed / Delivered |
| Выпуск | 7u40 |
| Компонент | hotspot / svc |
| Обсуждение | serviceability dash dev at openjdk dot java dot net |
| Трудоёмкость | XL |
| Длительность | XL |
| Связан с | 8005849: JEP 167: Event-Based JVM Tracing |
| Рецензенты | John Coomes |
| Одобрен | John Coomes, Mikael Vidstedt |
| Создан | 2012/09/12 20:00 |
| Обновлён | 2026/07/29 19:01 |
| Задача | 8046157 |
Аннотация
Создать инфраструктуру для подробной трассировки JVM и добавить трассировку во все подкомпоненты JVM.
Что не является целью
Этот проект не ставит целью визуализацию или анализ данных трассировки.
Критерии успеха
- Измеримые накладные расходы на производительность отсутствуют, когда трассировка не включена.
Мотивация
Подробная информация о внутренней работе JVM может быть полезна как клиентам для настройки производительности, так и для отладки и сопровождения.
Описание
Инфраструктура будет спроектирована так, чтобы её можно было реализовать с низкими накладными расходами. Трассировка будет выполняться в форме событий, которые несут данные. Эти события будут также нести метаданные, облегчающие отображение информации.
Примеры событий: «Young Generation Collection» и «Method Compiled». У каждого события есть несколько полей, которые могут содержать дополнительную информацию о событии. Например, в два указанных события вошли бы поля «Heap Usage Before» и «Method Name». Кроме того, события содержат поток, в котором они произошли, а также информацию о времени.
Время событий
Событиям автоматически присваиваются метки времени. С точки зрения учёта времени существует два класса событий:
- Мгновенные события: у них есть только одна метка времени
- События с длительностью: у них есть время начала и время окончания
Определение событий
Все события определяются в исходном коде с полным описанием события и всех его полей. Описание включает типы данных и типы содержимого полей, а также понятное человеку описание события.
Тип данных обозначает двоичное кодирование данных. Примеры: string, int и float.
Тип содержимого обозначает смысловое значение данных. Примеры: байты, миллисекунды и проценты.
Большой объём метаданных о событиях и полях нужен для того, чтобы клиенты, получающие данные, могли их интерпретировать и отображать подходящим образом.
Инструментирование событиями
Исходный код JVM инструментируется созданием событий. Обычно инструментирование выглядит примерно так:
size_t heapSizeBefore, heapSizeAfter;
EventYoungCollection yc_event;
// Do the collection here and set the values
// of heapSizeBefore and heapSizeAfter
yc_event.set_heapBefore(heapSizeBefore);
yc_event.set_heapAfter(heapSizeAfter);
yc_event.commit();
Если инструментированный код критичен для производительности, последние три оператора можно выполнять при условии yc_event.should_commit(), и тогда они не будут выполняться, если трассировка не включена.
Альтернативы
Один из альтернативных подходов, уже присутствующий в JVM, — пробы DTrace. Некоторые недостатки DTrace с точки зрения инструментирования JVM:
- Доступен только в Solaris и OS X (хотя ведётся работа по его переносу на Linux).
- Не содержит подробных метаданных о предоставляемой информации.
- Связь между начальной и конечной точками события только неявная.
Тестирование
Помимо модульных тестов, важно проверить, что инструментирование не влияет на характеристики производительности JVM. Когда инструментирование выключено, влияние на производительность не должно быть измеримым.
Влияние
- Производительность и масштабируемость: как сказано выше, когда инструментирование выключено, оно не должно влиять на производительность.