Java アプリケーションのパフォーマンス最適化

JavaBeginner
オンラインで実践に進む

はじめに

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

ガベージコレクタの選択

ガベージコレクションは、Java アプリケーションでもはや使用されていないオブジェクトが占有しているメモリを解放するプロセスです。ガベージコレクタの選択は、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。JVM はいくつかのガベージコレクタを提供しており、それぞれに独自の長所と短所があります。

  • -XX:+UseSerialGC:シリアルガベージコレクタを有効にします。これは、ガベージコレクションに単一のスレッドを使用します。
  • -XX:+UseParallelGC:パラレルガベージコレクタを有効にします。これは、ガベージコレクションに複数のスレッドを使用します。
  • -XX:+UseParNewGC:コンカレントマークスイープ (CMS) ガベージコレクタを有効にします。これは、複数のスレッドを使用してコンカレントなガベージコレクションを実行します。
  • -XX:+UseG1GC:ガーベッジファースト (G1) ガベージコレクタを有効にします。これは、一貫した一時停止時間と高いスループットを提供するように設計されています。

たとえば、パラレルガベージコレクタを有効にするには、次のコマンドを使用できます。

java -XX:+UseParallelGC MyApp

ガベージコレクション活動のログ記録

ガベージコレクションのログ記録により、ガベージコレクタのパフォーマンスを監視し、アプリケーションの要件に基づいてガベージコレクタのパラメータを調整することができます。ガベージコレクションのログ記録を有効にするには、次のパラメータを使用できます。

  • -XX:+UseGCLogFileRotation:ガベージコレクションログのログ回転を有効にします。
  • -XX:NumberOfGCLogFiles=<ログファイルの数>:ガベージコレクションログのログファイル数を制限します。
  • -XX:GCLogFileSize=<ファイルサイズ><単位>:ガベージコレクションログのサイズ制限を指定します。
  • -Xloggc:[gc.log ファイルのパス]:ガベージコレクションログのパスを指定します。

たとえば、ガベージコレクションのログ記録を有効にして、ログファイルのパスを /path/to/gc.log に設定するには、次のコマンドを使用できます。

java -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log MyApp

メモリ不足エラーの対処

JVM がメモリを使い果たすと、メモリ不足エラーが発生します。このエラーを対処するために、次の JVM パラメータを使用できます。

  • -XX:+HeapDumpOnOutOfMemoryError:メモリ不足エラーが発生すると、JVM はヒープダンプをディスクに書き出します。
  • -XX:HeapDumpPath=<ヒープダンプファイルのパス>:ヒープダンプファイルのパスを指定します。
  • -XX:OnOutOfMemoryError=<コマンド>:メモリ不足エラーが発生すると、JVM は指定されたコマンドを実行します。
  • -XX:+UseGCOverheadLimit:JVM はこのオプションを使用して、ガベージコレクションに費やされる時間の制限を設定します。

たとえば、メモリ不足エラーが発生したときに JVM が /path/to/heapdump.hprof ファイルにヒープダンプを書き出すように構成するには、次のコマンドを使用できます。

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp

64 ビット JVM の使用

32 ビットまたは 64 ビットの JVM を選択するには、-d パラメータを使用できます。たとえば、64 ビット JVM を使用するには、次のコマンドを使用できます。

java -d64 MyApp

JVM パラメータを使用した Java アプリケーションのコンパイルと実行

前の手順で学んだ JVM パラメータを使って、HelloWorld.java プログラムを使って Java アプリケーションをコンパイルして実行しましょう。

cd ~/project
touch HelloWorld.java
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 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log HelloWorld

これにより、ログファイルのパスが /path/to/gc.log に設定されます。

その他の頻繁に使用されるパラメータを使った Java アプリケーションのコンパイルと実行

次に、-XX:+UseStringDeduplication-XX:MaxHeapFreeRatio パラメータを使って Java アプリケーションをコンパイルして実行しましょう。

java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld

これにより、文字列の重複除去が有効になり、ガベージコレクション後の空きヒープ領域の最大割合が 70% に設定されます。

まとめ

この実験では、Java アプリケーションのパフォーマンスを最適化するためにさまざまな JVM パラメータを設定する方法を学びました。ヒープメモリサイズの設定方法、ガベージコレクタの選択方法、ガベージコレクションログの有効化方法、メモリ不足エラーの対処方法、64 ビット JVM の使用方法、その他の頻繁に使用されるパラメータの設定方法を学びました。また、JVM パラメータを使って Java アプリケーションをコンパイルして実行する方法も学びました。