torutkのブログ

ソフトウェア・エンジニアのブログ

jlinkのオプション指定でカスタムJREのサイズ削減

jlinkのオプション指定でカスタムJREのサイズ削減

はじめに

先週のJava読書会BOF主催「The Java Module System」を読む会(第10回)では、jlinkコマンドで実行イメージを生成する章を主に読みました。 そこには、生成する実行イメージのサイズを小さくする幾つかのオプションが紹介されていました。 そこで、オプションを指定するとどれだけ実行イメージが小さくなるのか、手元の環境で確認しました。

確認環境

項目 内容
OS Windows 10 Pro 1909 64bit 日本語版
JDK Liberica JDK 14.0.2 full 64bit版

確認結果

サイズ削減に関するオプション指定のないデフォルトでの実行イメージ生成のコマンドラインが次です。 (実行イメージには、java.baseモジュールだけを含む指定)

D:\work> jlink --add-modules java.base --output runtime

ここに、いくつかサイズ削減に関するオプションを指定し、どれだけ実行イメージが削減されるかを見てみました。

No. 指定したオプション サイズ(MB)
1 デフォルト 46.1
2 --compress=1 39.0
3 --compress=2 33.7
4 --strip-debug 40.6
5 --no-header-files 45.9
6 --strip-native-commands 46.0
7 No.3、No.4、No.5 31.0
compressオプション

1を指定すると、文字列リテラルの重複をなくし、共有します。

2を指定すると、lib/modulesファイルをzip圧縮します。

strip-debugオプション

JDK 13より前は、Javaデバッグ情報を削除します。 JDK 13からは、Javaデバッグ情報に加えてネイティブコマンド・ネイティブライブラリからもデバッグ情報を削除します。

[JDK-8219207] Add --strip-java-debug-attributes jlink option - Java Bug System

[JDK-8219257] Add --strip-native-debug-symbols jlink plugin - Java Bug System

no-header-filesオプション

JNIライブラリ作成時に使用するC/C++のヘッダーファイルを削除します。

strip-native-commands

javaコマンド等を生成しないようにします。このオプションを指定して生成した実行イメージにはjavaコマンドがないのでアプリケーションが実行できなくなります。

何故このオプションがあるのかなと考えると、jpackageツール(JDK 14から搭載)でインストーラをつくるとアプリケーション起動専用実行コマンドが作られるので、javaコマンドがなくてもアプリケーションを実行することができるからではないかと思います。

jpackageコマンドが使用するjlinkのオプション

JDK 14から搭載されたjpackageコマンドは、--runtime-imageオプションで予め生成した実行イメージを指定しない場合、内部でjlinkコマンドを呼び出しアプリケーション実行イメージを生成します。このとき、--strip-debug、--no-header-files、--no-manpages、--strip-native-commands のオプションをjlinkに対して使用します。

まとめ

jlinkコマンドで実行イメージを小さくする幾つかのオプションが用意されています。 配布する実行イメージを生成するときは、必要がなければこれらのオプションを指定してイメージサイズを小さくするとよいです。