【続】JVM 終了時の ShutdownHook が動きません


はじめに

jdk-21.0.2+13 で行われた変更により、シャットダウン・フックが動かなくなった原因の継続調査。

以下の続きになります。

blog1.mammb.com


MCVE

MCVE にして調査を進めよう。

App.java

public class App {

    public static void main(String[] args) {

        System.out.println("java.vm.version: " + System.getProperty("java.vm.version"));

        Runtime.getRuntime().addShutdownHook(new Thread("My Shutdown Hook") {
            public void run() {
                System.out.println("ShutdownHook started");
                try { Thread.sleep(3000); } catch (Exception e) { }
                System.out.println("ShutdownHook finished");
            }
        });

        while (true) {
            try { 
                Thread.sleep(3000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.print(".");
        }
    }
}

jar に固めて実行する。

javac .\App.java
jar -cvfe libs\app.jar App *.class
java -jar libs\app.jar

この時の Java が jdk-21.0.1+12 でも jdk-21.0.8+9 でも、ShutdownHook finished が表示され、シャットダウンフックは正しく処理されるようだ。

となると jpackage 側の問題か?


MCVE jpackage

app.jarjpackage でアプリケーションイメージを作成する。

jpackage --type app-image --win-console --name app --input libs --main-jar app.jar

この時の Java が jdk-21.0.1+12 の場合、ShutdownHook finished が表示される。

この時の Java が jdk-21.0.8+9 の場合、ShutdownHook finished は表示されない。

jpackage に問題が潜んでいるようだ。



こいつか、犯人は

改めてリリースノートを見ると、

8301247: JPackage app-image exe launches multiple exe's in JDK 17+

こいつか、犯人は

Commit 610f164

プロセスの起動方法を Executor から起動するように変更しているようだ。


以下で報告しておいた。

bugs.openjdk.org