はじめに
JVMパラメータは、Javaバイトコードの実行を担うJava仮想マシン(JVM)を設定するために使用されます。JVMパラメータを適切に設定することで、Javaアプリケーションのパフォーマンスを向上させることができます。この実験では、Javaアプリケーションのパフォーマンスを最適化するために、よく使われるJVMパラメータの設定方法を学びます。
ヒープメモリの設定
ヒープメモリは、Javaオブジェクトが割り当てられる実行時のデータ領域です。-Xmx および -Xms パラメータを使用して、ヒープメモリのサイズを設定できます。
-Xmx<heap size>[unit]: 最大ヒープサイズを設定します。-Xms<heap size>[unit]: 初期ヒープサイズを設定します。
例えば、最小ヒープサイズを512MB、最大ヒープサイズを1GBに設定するには、以下のコマンドを使用します。
java -Xms512m -Xmx1g MyApp
ガベージコレクタの選択
ガベージコレクション(GC)は、Javaアプリケーションで使用されなくなったオブジェクトが占有しているメモリを解放するプロセスです。ガベージコレクタの選択は、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。JVMには複数のガベージコレクタが用意されており、それぞれに長所と短所があります。
-XX:+UseSerialGC: シリアルガベージコレクタを有効にします。単一のスレッドでガベージコレクションを行います。-XX:+UseParallelGC: パラレルガベージコレクタを有効にします。複数のスレッドを使用してガベージコレクションを行います。-XX:+UseParNewGC: コンカレント・マーク・スイープ(CMS)ガベージコレクタを有効にします。複数のスレッドを使用して並行的にガベージコレクションを行います。-XX:+UseG1GC: Garbage-first (G1) ガベージコレクタを有効にします。一貫した停止時間と高いスループットを実現するように設計されています。
例えば、パラレルガベージコレクタを有効にするには、以下のコマンドを使用します。
java -XX:+UseParallelGC MyApp
ガベージコレクション活動のログ記録
ガベージコレクションのログ記録を行うことで、ガベージコレクタのパフォーマンスを監視し、アプリケーションの要件に基づいてパラメータを調整できます。以下のパラメータを使用して、ガベージコレクションのログ記録を有効にできます。
-Xlog:gc*: 最近のJavaリリースでガベージコレクションのログ記録を有効にします。file=gc.log: ログ出力をgc.logという名前のファイルに書き込みます。filecount=10: 最大10個のローテーションされたログファイルを保持します。filesize=10M: ログファイルが10MBに達するとローテーションします。
例えば、ガベージコレクションのログ記録を有効にし、ログを gc.log に保存するには、以下のコマンドを使用します。
java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M MyApp
Out of Memoryエラーの処理
JVMのメモリが不足すると、Out Of Memoryエラーが発生します。このエラーを処理するために、以下のJVMパラメータを使用できます。
-XX:+HeapDumpOnOutOfMemoryError: Out Of Memoryエラーが発生した際、JVMはヒープダンプをディスクに書き出します。-XX:HeapDumpPath=<path to heap dump file>: ヒープダンプファイルのパスを指定します。-XX:OnOutOfMemoryError=<command>: Out Of Memoryエラーが発生した際、JVMは指定されたコマンドを実行します。-XX:+UseGCOverheadLimit: JVMはこのオプションを使用して、ガベージコレクションに費やす時間の制限を設定します。
例えば、Out Of Memoryエラーが発生した際に /path/to/heapdump.hprof ファイルにヒープダンプを書き出すようJVMを設定するには、以下のコマンドを使用します。
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp
64ビットJVMの使用
-d パラメータを使用して、32ビットまたは64ビットのJVMを選択できます。例えば、64ビットJVMを使用するには、以下のコマンドを使用します。
java -d64 MyApp
JVMパラメータを使用したJavaアプリケーションのコンパイルと実行
HelloWorld.java プログラムを使用して、これまでのステップで学んだJVMパラメータでJavaアプリケーションをコンパイルおよび実行してみましょう。
cd ~/project
touch HelloWorld.java
以下のコードを入力します。
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
ファイルを保存して終了します。次に、-Xmx パラメータを指定してコードをコンパイルおよび実行します。
javac HelloWorld.java
java -Xmx512m HelloWorld
これにより、最大ヒープサイズが512MBに設定されます。以下の出力が表示されるはずです。
Hello, World!
ガベージコレクタを使用したJavaアプリケーションのコンパイルと実行
次に、パラレルガベージコレクタを使用してJavaアプリケーションをコンパイルおよび実行します。
java -XX:+UseParallelGC HelloWorld
以下の出力が表示されるはずです。
Hello, World!
ガベージコレクションのログ記録を有効にしたJavaアプリケーションのコンパイルと実行
次に、ガベージコレクションのログ記録を有効にしてJavaアプリケーションをコンパイルおよび実行します。
java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M HelloWorld
これにより、プログラムの実行中、現在のディレクトリにある gc.log にガベージコレクションのログが書き込まれます。
その他の頻繁に使用されるパラメータを用いたJavaアプリケーションのコンパイルと実行
最後に、-XX:+UseStringDeduplication および -XX:MaxHeapFreeRatio パラメータを使用してJavaアプリケーションをコンパイルおよび実行します。
java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld
これにより、文字列の重複排除が有効になり、ガベージコレクション後の空きヒープ領域の最大比率が70%に設定されます。
まとめ
この実験では、Javaアプリケーションのパフォーマンスを最適化するために、さまざまなJVMパラメータを設定する方法を学びました。ヒープメモリサイズの設定、ガベージコレクタの選択、ガベージコレクションのログ記録の有効化、Out Of Memoryエラーの処理、64ビットJVMの使用、およびその他の頻繁に使用されるパラメータの設定方法を習得しました。また、JVMパラメータを指定してJavaアプリケーションをコンパイルおよび実行する方法も学びました。



