Spring BootのFlightRecorderApplicationStartupを試す

Spring Boot 2.4 (Spring Framework 5.3) から追加されたFlightRecorderApplicationStartupを試したときのメモ。

追記
このバグがあるので、Spring Boot 2.4.7 (Spring Framework 5.3.8) 以降を使ったほうがいい。
https://github.com/spring-projects/spring-framework/issues/26941

準備

JDK Mission Control

ここからJDK Mission Controlをダウンロードしてインストールする。

ソースコード

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

DemoApplication.java

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    public static class Foo {}

    @Bean
    public Foo foo() {
        try {
            // duration確認用に5秒sleepを入れる
            TimeUnit.SECONDS.sleep(5);
        } catch (Exception ignored) { }
        return new Foo();
    }

    @Override
    public void run(String... args) {
        System.out.println("Hello!");
    }

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(DemoApplication.class);
        app.setApplicationStartup(new FlightRecorderApplicationStartup());
        app.run(args);
    }
}

Demo

Flight Recorderを有効にしてデモアプリを実行すると、jfrファイルが作成される。
(filenameとdurationはとりあえずマニュアルと同じ)

% sdk use java 11.0.10.hs-adpt

% java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar build/libs/demo-0.0.1-SNAPSHOT.jar

JDK Mission Controlでjfrファイルを開くと、イベント・ブラウザ => 「Spring Application」カテゴリ => 「Startup Step」イベントで、foo beanのspring.beans.instantiateに5秒かかっているのが確認できた。

参考

ソースコードはこの辺り