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.
コマンド
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 ...