Парсер JMC для дампов Java JFR с использованием Jrockit
Я узнал, что синтаксический анализ JFR в Java может выполняться неподдерживаемыми синтаксическими анализаторами, такими как анализатор JMC, с использованием jrockit из этого. Также я подумал, что во время записи будет много событий.
Если я хочу получить значения данных из различных событий, таких как трассировка стека на вкладке "События", "горячий метод" на вкладке "Код", дерево вызовов на вкладке "Код" и т. Д. И т. Д. Как фильтровать? Пример изображения
например, я смог отфильтровать дерево вызовов, используя следующий код, как указано в jfr-flame-graph.
final String EVENT_TYPE = "Method Profiling Sample";
IView view = recording.createView();
for(IEvent event : view){
if(EVENT_TYPE.equals(event.getEventType().getName())){
FLRStackTrace flrStackTrace = (FLRStackTrace) event.getValue("(stackTrace)");
Здесь тип события - метод Profiling Sample; Идентификатор - (трассировка стека);
Итак, если я хочу получить трассировку стека / горячие методы / и т.д., какие события / идентификаторы мне нужно захватить? Есть ли какие-либо документы для этого?
2 ответа
Там нет никакой документации для этого. Если вы хотите извлечь стековые трассировки, jfr-flame-graph является очень хорошим примером. Разница между событиями / трассировкой стека и кодовыми / горячими методами заключается в том, что на вкладке "Горячие методы" используется только событие "Образец профилирования метода", вкладки "События" являются более общими и отображают типы событий, выбранные вами в представлении "Типы событий". Дерево кода / вызовов такое же, как у Hot Methods, но "вверх ногами".
Чтобы увидеть, какие другие доступные события вы можете использовать пользовательский интерфейс JMC. Там есть функция, которая называется Дизайнерский вид (Нажмите Окно / Показать представление / Дизайнер). Если у вас есть открытая запись, вы можете использовать красную кнопку остановки, чтобы перейти в режим разработки интересующей вас вкладки, затем щелкнуть правой кнопкой мыши интересующий компонент, чтобы увидеть, какие типы событий и атрибуты он использует.
JDK 9 имеет поддерживаемый API синтаксического анализатора.
Path p = Paths.get("recording.jfr");
for (RecordedEvent event: RecordingFile.readAllEvents(p)) {
System.out.println(event);
}
Для более полного примера см. Javadoc http://docs.oracle.com/javase/9/docs/api/jdk/jfr/consumer/package-summary.html