openjdk.ruOpenJDK на русском

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. Когда инструментирование выключено, влияние на производительность не должно быть измеримым.

Влияние

  • Производительность и масштабируемость: как сказано выше, когда инструментирование выключено, оно не должно влиять на производительность.