この記事は,以前IBMのdeveloperWorks上で公開されていたWAS Traditional環境向けのWAS小ワザ集のLiberty版です。
ガーベッジ・コレクション(GC)の記録
Javaヒープの枯渇によるOutOfMemoryErrorや,GCによるパフォーマンスの問題を調査する際には,Javaヒープの使用状況とGCの実行を記録することが必須です。Libertyを使用する際には,できるだけGCの情報を記録するようにしましょう。
GCの情報を記録するためには,JVMの起動オプションを指定します。Libertyでは,サーバーの構成ファイルであるserver.xmlと同じディレクトリにjvm.optionsというファイルを作成し,その中に起動オプションを指定します。オプションは,1行に一つずつ指定するようにします。指定する内容は,使用しているJVMの種類によって異なります。
J9VM/OpenJ9での記録
製品の導入ディスクに含まれているIBM SDK for Java Version 8.xや,IBM Semeru Runtimesを使用している場合です。これらの環境では,IBMが独自に開発したJ9VMや,それをOSSとして公開したOpenJ9が使用されています。
jvm.optionsに以下の内容を記述します。この設定では,GCの記録は他のJVM出力と分けられて,messages.logなどと同じディレクトリにファイルとして記録されます。ファイル名はverbosegcからはじまり,日付やプロセスIDなどがふくまれたものになります。
-verbose:gc
-Xverbosegclog:logs/verbosegc.%Y%m%d.%H%M%S.%pid.log
HotSpot VMでの記録
Eclipse Temurinや他のHotSpot VM系のJDKディストリビューションを使用している場合には,使用しているJavaのバージョンによって設定内容が異なります。
Java 11/17や,それ以降のバージョンを使用している場合には,以下の内容を記述します。同じくlogsディレクトリにverbosegc.logというファイル名でGCの情報が記録されます。サーバーを再起動すると,以前の情報はファイル末尾に数字がついたファイルとしてバックアップされます。
-Xlog:gc*:logs/verbosegc.log:time,level,tags
Java 8を使用している場合には,以下の内容を記述します。この場合は,verbosegc.logの情報はサーバーを再起動するたびに上書きされてしまいます。トラブルなどがあった場合には,再起動する前にかならずlogsディレクトリのファイルをバックアップして情報を残すようにしてください。
-verbose:gc
-Xloggc:logs/verbosegc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
余談:サーバーごとに起動するJVMを変える
今回の記事を執筆するに当たって,サーバーごとに起動するJVMをSemeruだったりTemurinだったりに変えてテストを実行しました。このように特定のサーバーを特定のJVMで起動して利用したい場合には,server.envにJAVA_HOME環境変数を記述します。
% cat usr/servers/semeru17/server.env
JAVA_HOME=/Library/Java/JavaVirtualMachines/ibm-semeru-open-17.jdk/Contents/Home
% cat usr/servers/temurin17/server.env
JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
% cat usr/servers/temurin8/server.env
JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
ただし,このような環境に依存する絶対パスを構成ファイルに記述してしまうと,その環境からserver package
コマンドで作成したアーカイブに可搬性がなくなってしまいますのでご注意ください。