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