torutkのブログ

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

Java SE 9で小さなプログラムを動かすためのJavaVMオプション指定

先日、アナログ時計表示プログラムをJava SE 9のモジュール化対応をしました。
AnalogClockプログラムをJava SE 9のモジュール化 - torutkの日記

次は、Java SE 9での実行です。
Java SE 9からは正式リリースに32bit版が含まれず、64bit版のみとなっています。直前のEarly Access版では32bit版も存在していたので、32bit対応していないのではなく、Oracleがもう32bit OSをJava SEのサポート対象から外したということのようです。

ここで、64bit版Javaでアナログ時計を動かす問題として、64bit版のJavaVMのデフォルト設定が異常にメモリ・CPU喰いとなっている点にあります。これは、サーバー上に一つのJavaVMプロセスが稼働し、そのプロセス上で多数のスレッドが動作するサーバー用アプリケーションには適した設定です。しかし、JavaVMを多数稼動させるサーバーや、デスクトップ機のようにJavaVMやそれ以外のいくつものアプリケーションが多数動いている環境には不向きな設定です。

Java SE 8の64bit版JavaVMでは、デフォルトのGC(Parallel GC)が論理CPU数を並列実行します。また、メモリもJavaヒープのサイズが初期値で搭載メモリの1/64(16GB搭載PCなら256MB)となります。

この問題と対処については、JJUG CCC 2016 Springで登壇した次のセッションで触れています。
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々

Java SE 8までは、32bit版のJavaVMのデフォルト設定がメモリとCPUを控え目に使うようになっているので、32bit JavaVMでアプリケーションを動かすことで面倒なパラメーター設定をせずにすみました。

しかし、Java SE 9からは、64bit版JavaVMしか(Oracleから)提供されていないため、JavaVMオプションをいくつも指定してメモリとCPUを控えめにすることが必要となります。

また、32bit版の提供がないこととは別に、JavaVMからHotSpot Clientが無くなるという方針が出ていました。
Java SE 9ではHotSpot Client VMが無くなるとのこと - torutkの日記

そこで、64bit版JavaVMでメモリとCPUを控えめにする設定を次に記載しました。
http://www.torutk.com/projects/swe/wiki/JDK_9_JavaVM%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3

アナログ時計のプログラムの作成では、Windows OS用インストーラを作成するjavapackagerのオプション引数でこのJavaVMの設定を行っています。

javapackager -deploy -native msi ^
-v ^
-outdir dist -outfile AnalogClockGadget ^
-p dist -m AnalogClockGadget/com.torutk.gadget.analogclock.AnalogClockApp ^
-name "AnalogClock" ^
-BappVersion=0.4.2 ^
-title "Analog Clock Gadget" ^
-vendor Takahashi ^
-description "Analog Clock on desktop" ^
-BjvmOptions=-Xms32m ^
-BjvmOptions=-Xmx128m ^
-BjvmOptions=-Xss256k ^
-BjvmOptions=-XX:TieredStopAtLevel=1 ^
-BjvmOptions=-XX:CICompilerCount=2 ^
-BjvmOptions=-XX:CompileThreshold=1500 ^
-BjvmOptions=-XX:InitialCodeCacheSize=160k ^
-BjvmOptions=-XX:ReservedCodeCacheSize=32m ^
-BjvmOptions=-XX:+UseSerialGC

Java SE 9のモジュール化によって、自己完結型アプリケーション(アプリケーションプログラムと、アプリケーションプログラムを動かすのに必要となるJavaランタイム)をインストールしたサイズは、Java SE 8と比べると次のように小さくなりました。

項目 Java SE 8 Java SE 9
容量 168MB 90MB
ファイル数 159 131