jfrコマンドの備忘録

Memo

準備

JFRファイルのサイズを大きくしたいので、大量のJFRイベントを書き込むデモアプリを用意する。

Main.java

import java.time.LocalDateTime;
import jdk.jfr.Category;
import jdk.jfr.Description;
import jdk.jfr.Event;
import jdk.jfr.Label;
import jdk.jfr.Name;

public class Main {
    @Name("hirakida.Hello")
    @Label("Hello")
    static class HelloEvent extends Event {
        @Label("Message")
        String message;
        @Label("DateTime")
        LocalDateTime dateTime;
    }

    public static void main(String[] args) {
        while (true) {
            HelloEvent event = new HelloEvent();
            event.message = "Hello!";
            event.dateTime = LocalDateTime.now();
            event.begin();
            event.commit();
        }
    }
}

JFRを有効にして、デモアプリを実行する。

% sdk use java 17.0.4.1-tem

% java -XX:StartFlightRecording:filename=recording.jfr Main.java
[1.240s][info][jfr,startup] Started recording 1. No limit specified, using maxsize=250MB as default.
[1.240s][info][jfr,startup] 
[1.240s][info][jfr,startup] Use jcmd 6058 JFR.dump name=1 to copy recording data to file.

コマンド

print

flight recordingの内容を表示する。

% jfr print --events hirakida.Hello recording.jfr
hirakida.Hello {
  startTime = 14:53:33.505
  duration = 0.000011 ms
  message = "Hello!"
  eventThread = "main" (javaThreadId = 1)
  stackTrace = [
    Main.main(String[]) line: 29
    jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
    jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Object, Object[]) line: 77
    jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
    java.lang.reflect.Method.invoke(Object, Object[]) line: 568
    ...
  ]
}

...

JSON形式

% jfr print --json --events hirakida.Hello recording.jfr
{
  "recording": {
    "events": [{
      "type": "hirakida.Hello", 
      "values": {
        "startTime": "2022-09-17T14:53:33.505442889+09:00", 
        "duration": "PT0.000000011S", 
        "eventThread": {
          "osName": "main", 
          "osThreadId": 6659, 
          "javaName": "main", 
          "javaThreadId": 1, 
          "group": {
            "parent": {
              "parent": null, 
              "name": "system"
            }, 
            "name": "main"
          }
        }, 
...

metadata

イベントの情報を表示する。

% jfr metadata recording.jfr
class boolean {
}

class byte {
}

class char {
}

class double {
}

class float {
}

class int {
}

class long {
}

class short {
}

@Name("java.lang.Class")
@Label("Java Class")
class Class {
  @Label("Class Loader")
  ClassLoader classLoader;

  @Label("Name")
  String name;

  @Label("Package")
  Package package;

  @Label("Access Modifiers")
  int modifiers;

  @Label("Hidden")
  boolean hidden;
}

...

disassemble

JFRファイルを分割する。

% mkdir out

% jfr disassemble --output out recording.jfr

Examining recording /Users/hirakida/work/recording.jfr ...

File consists of 19 chunks. The recording will be split into 4 files

Writing /Users/hirakida/work/out/recording_0.jfr ... 66784534
Writing /Users/hirakida/work/out/recording_1.jfr ... 66796485
Writing /Users/hirakida/work/out/recording_2.jfr ... 66693161
Writing /Users/hirakida/work/out/recording_3.jfr ... 50546118

assemble

JFRファイルを統合する。

% jfr assemble out assemble.jfr

Assembling files... 

 /Users/hirakida/work/out/recording_0.jfr
 /Users/hirakida/work/out/recording_1.jfr
 /Users/hirakida/work/out/recording_2.jfr
 /Users/hirakida/work/out/recording_3.jfr

Finished.

summary

サマリーを表示する。

% jfr summary recording.jfr

 Version: 2.1
 Chunks: 19
 Start: 2022-09-17 05:53:33 (UTC)
 Duration: 19 s

 Event Type                                   Count  Size (bytes) 
==================================================================
 hirakida.Hello                            11686763     245434096
 jdk.BooleanFlag                               9975        304950
 jdk.NativeLibrary                             9728        858382
 jdk.ModuleExport                              9063         96786
 jdk.GCPhaseParallel                           6668        177786
 jdk.ActiveSetting                             6308        194047
 jdk.SystemProcess                             4645        373916
 jdk.LongFlag                                  3762        125020
 jdk.ModuleRequire                             2869         28690
 jdk.UnsignedLongFlag                          2774         94696
 jdk.ObjectAllocationSample                    2428         38397
 ...

参考