テクノロジー 開発 実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

パフォーマンスとデバッグを向上させるために重要な JVM (Java 仮想マシン) オプションについて理解します。

Java 開発者またはミドルウェア管理者であれば、JVM オプションの意味とその重要性、およびそれらがアプリケーションにどのような影響を与えるかを知っておく必要があります。それらを調べてみましょう。

JVM オプションの概要

JVM オプションについて言えば、JVM に含めることができるオプションには、標準オプション、非標準オプション、および詳細オプションの 3 種類があります。詳細オプションを試行する場合は、常に -XX を指定してオプションを使用します。同様に、非標準オプションを適用する場合は、 -X を使用します。標準オプションは、オプションの前に何も追加しません。

アプリケーションではどの JVM オプションが使用されますか?

アプリケーションが Linux 上で実行されている場合は、 ps -ef | grep java を使用できます。 ps -ef | grep java 使用して Java プロセスを特定し、プロセス引数として出力された JVM オプションを確認します。システム上で複数の Java プロセスが実行されている場合は、Java アプリケーションに固有のキーワードを使用することが必要になる場合があります。

引数が長すぎる場合は、 ps -auxww を使用してみてください。このコマンドでは長い引数リストも表示されます。

JVM フラグのリストを取得すると、Tomcat などの Java アプリケーションの動作についてのアイデアを得ることができます。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

Java ヒープ サイズ

  -Xms - set initial Java heap size
 -Xmx - set maximum Java heap size
 -Xss - set java thread stack size 

-Xms – このオプションは、JVM の開始ヒープ サイズを定義します (例: Xms2048m 。これは、JVM の初期ヒープ サイズが約 2 GB であることを意味します。したがって、JVM が起動すると、ヒープ メモリはこれほど大きくなります。驚くべきことに、そうです!これは、起動時のサイズ変更を防止し、JVM の起動時間を短縮するために行われます。

-Xmx – このオプションは、JVM の最大ヒープ サイズを定義します。たとえば、 Xmx2048m は、JVM の最大ヒープ サイズが 2 GB のみになることを意味します。

基本的には、常に -Xms -Xmx 一緒に使用することになります。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

ヒープのパーセンテージを設定します

-XX:MaxHeapFreeRatio – 圧縮を避けるために、GC 後に解放されるヒープの最大割合を設定します。

-XX:MinHeapFreeRatio – 拡張を避けるために、GC 後に空きヒープの最小割合を設定します。ヒープ使用量を監視するには、JCosole を使用できます。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

クラスデータ共有を有効にする

Xshareclasses オプションを指定して、共有クラス キャッシュでのクラス データの共有を有効にします。 JVM は既存のキャッシュに接続するか、キャッシュが存在しない場合はキャッシュを作成します。複数のキャッシュを持つことができ、 -Xshareclasses オプションにサブオプションを追加することで正しいキャッシュを指定できます。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

PermGen サイズ

以前の JVM オプションはヒープ メモリのサイズを定義しますが、 -XX:PermSize は文字列プールとクラス メタデータが保存される PermGen 領域のサイズを定義します。このオプションは、展開中に Web アプリケーションのクラスをロードすることが多い Tomcat のような Web サーバーに特に効果的です。

ところで、PermGen スペースは Java 8 の Metaspace によって引き継がれるため、このオプションは JRE 8 JVM で実行している場合には適用できないことを認識してください。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

印刷GC

  -verbose:gc - logs garbage collector runs and how long they're taking. 
-XX:+PrintGCDetails - includes the data from -verbose:gc but also adds information about the size of the new generation and more accurate timings.
-XX:-PrintGCTimeStamps - Print timestamps at garbage collection. 

これらの JVM オプションは、ガベージ コレクション ログを有効にするために使用されます。これは、レイテンシの影響を受けやすい操作に非常に効果的です。以前はマイクロ秒のレイテンシーを追求するシステムを使用していましたが、ご存知のとおり、大規模なガベージ コレクションは数ミリ秒続くことがあります。

したがって、LMAX ディスラプターのような GC フリー アーキテクチャを採用しますが、実際、レイテンシに敏感なアプリケーションを使用しない場合は、この便利なオプションが重要な GC 統計をアドバイスします。これにより、大規模なガベージ コレクションか小規模なガベージ コレクションか、どの種類のガベージ コレクタが適用されるか、メモリが復元される頻度、メモリの保持時間などがわかります。

「OutOfMemory」エラーの処理

メモリ不足時にヒープ ダンプをトリガーするには、 -XX:+HeapDumpOnOutOfMemoryError を使用できます。

この JVM オプションは、JVM が OutOfMemory エラーで停止したときにスタック ダンプを生成します。実際に OOM が発生しない限り、費用は発生しません。このフラグは、通常、問題を深く判断する唯一の方法であるため、運用システムでは必須です。

ヒープ ダンプは、デフォルトで JVM の「現在のディレクトリ」にセットアップされます。特定のディレクトリにヒープダンプを作成したい場合は、次のコマンドを実行します。

 -XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"

ヒープ ダンプ ファイルのサイズは最大でギガバイトに達する可能性があるため、ターゲット ファイル システムに十分な容量があることを確認してください。

メモリ不足が発生した直後にサーバーを再起動したい場合は、同じ目的でこのパラメータを設定できます。

 XX:OnOutOfMemoryError="shutdown -r"

クラスのロードとアンロードをトレースする

-XX:+TraceClassLoading -XX:+TraceClassUnloading 、クラスが JVM にロードされるとき、または JVM からアンロードされるときにログ情報を出力するために使用する 2 つの JVM オプションです。これらの JVM フラグは、クラスローダーに関連する何らかのタイプのメモリ リークがあり、クラスがアンロードまたはガベージ コレクションされていないことが疑われる場合に役立ちます。

Java クラスパス

JAVA クラスパスについて話すと、 -Xbootclasspath 検証なしでロードするクラスパス エントリを指定します。 JVM は、ロードするすべてのクラスを検証して、int を使用したオブジェクトの参照解除、スタックからの余分なエントリのポップ、多すぎるエントリのプッシュなどが試行されていないかどうかを確認します。

クラスをブートクラスパスに置くとコストも節約されますが、クラスが以前に何度も検証されていることがわかっている場合にのみ使用してください。 JRuby では、これにより、単純なスクリプトの場合、起動時間が半分以上短縮されました。

プロファイリング

Java プロファイリングは、メソッドの実行、スレッドの実行、ガベージ コレクション、オブジェクトの作成など、さまざまな JVM レベルのパラメーターを監視するプロセスです。 Java プロファイリングでは、ターゲット アプリケーションの実行とそのリソースの使用状況をより詳細に把握できます。

 -Xprof 
-Xrunhprof

64ビット環境

32 ビットと 64 ビットの両方のパッケージがインストールされている OS 環境では、JVM はデフォルトとして 32 ビット環境パッケージを自動的に選択します。

環境を手動で 64 ビットに設定したい場合は、 -d<OS bit> パラメータを使用して設定できます。そして明らかに、OS ビットは 32 または 64 のいずれかになります。

結論

これがアプリケーションの JVM パラメータの設定に役立つことを願っています。 Javaメモリ管理について詳しく学びたい場合は、この Udemyコース をチェックしてください。

「実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション」についてわかりやすく解説!絶対に観るべきベスト2動画

【Track C-6】Azure 上で Java アプリケーションを動かそう!JBoss® EAP on ARO
【Track A-1】Java は今どこに向かっているのか

パフォーマンスとデバッグを向上させるために重要な JVM (Java 仮想マシン) オプションについて理解します。

Java 開発者またはミドルウェア管理者であれば、JVM オプションの意味とその重要性、およびそれらがアプリケーションにどのような影響を与えるかを知っておく必要があります。それらを調べてみましょう。

JVM オプションの概要

JVM オプションについて言えば、JVM に含めることができるオプションには、標準オプション、非標準オプション、および詳細オプションの 3 種類があります。詳細オプションを試行する場合は、常に -XX を指定してオプションを使用します。同様に、非標準オプションを適用する場合は、 -X を使用します。標準オプションは、オプションの前に何も追加しません。

アプリケーションではどの JVM オプションが使用されますか?

アプリケーションが Linux 上で実行されている場合は、 ps -ef | grep java を使用できます。 ps -ef | grep java 使用して Java プロセスを特定し、プロセス引数として出力された JVM オプションを確認します。システム上で複数の Java プロセスが実行されている場合は、Java アプリケーションに固有のキーワードを使用することが必要になる場合があります。

引数が長すぎる場合は、 ps -auxww を使用してみてください。このコマンドでは長い引数リストも表示されます。

JVM フラグのリストを取得すると、Tomcat などの Java アプリケーションの動作についてのアイデアを得ることができます。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

Java ヒープ サイズ

  -Xms - set initial Java heap size
 -Xmx - set maximum Java heap size
 -Xss - set java thread stack size 

-Xms – このオプションは、JVM の開始ヒープ サイズを定義します (例: Xms2048m 。これは、JVM の初期ヒープ サイズが約 2 GB であることを意味します。したがって、JVM が起動すると、ヒープ メモリはこれほど大きくなります。驚くべきことに、そうです!これは、起動時のサイズ変更を防止し、JVM の起動時間を短縮するために行われます。

-Xmx – このオプションは、JVM の最大ヒープ サイズを定義します。たとえば、 Xmx2048m は、JVM の最大ヒープ サイズが 2 GB のみになることを意味します。

基本的には、常に -Xms -Xmx 一緒に使用することになります。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

ヒープのパーセンテージを設定します

-XX:MaxHeapFreeRatio – 圧縮を避けるために、GC 後に解放されるヒープの最大割合を設定します。

-XX:MinHeapFreeRatio – 拡張を避けるために、GC 後に空きヒープの最小割合を設定します。ヒープ使用量を監視するには、JCosole を使用できます。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

クラスデータ共有を有効にする

Xshareclasses オプションを指定して、共有クラス キャッシュでのクラス データの共有を有効にします。 JVM は既存のキャッシュに接続するか、キャッシュが存在しない場合はキャッシュを作成します。複数のキャッシュを持つことができ、 -Xshareclasses オプションにサブオプションを追加することで正しいキャッシュを指定できます。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

PermGen サイズ

以前の JVM オプションはヒープ メモリのサイズを定義しますが、 -XX:PermSize は文字列プールとクラス メタデータが保存される PermGen 領域のサイズを定義します。このオプションは、展開中に Web アプリケーションのクラスをロードすることが多い Tomcat のような Web サーバーに特に効果的です。

ところで、PermGen スペースは Java 8 の Metaspace によって引き継がれるため、このオプションは JRE 8 JVM で実行している場合には適用できないことを認識してください。

実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション
実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション

印刷GC

  -verbose:gc - logs garbage collector runs and how long they're taking. 
-XX:+PrintGCDetails - includes the data from -verbose:gc but also adds information about the size of the new generation and more accurate timings.
-XX:-PrintGCTimeStamps - Print timestamps at garbage collection. 

これらの JVM オプションは、ガベージ コレクション ログを有効にするために使用されます。これは、レイテンシの影響を受けやすい操作に非常に効果的です。以前はマイクロ秒のレイテンシーを追求するシステムを使用していましたが、ご存知のとおり、大規模なガベージ コレクションは数ミリ秒続くことがあります。

したがって、LMAX ディスラプターのような GC フリー アーキテクチャを採用しますが、実際、レイテンシに敏感なアプリケーションを使用しない場合は、この便利なオプションが重要な GC 統計をアドバイスします。これにより、大規模なガベージ コレクションか小規模なガベージ コレクションか、どの種類のガベージ コレクタが適用されるか、メモリが復元される頻度、メモリの保持時間などがわかります。

「OutOfMemory」エラーの処理

メモリ不足時にヒープ ダンプをトリガーするには、 -XX:+HeapDumpOnOutOfMemoryError を使用できます。

この JVM オプションは、JVM が OutOfMemory エラーで停止したときにスタック ダンプを生成します。実際に OOM が発生しない限り、費用は発生しません。このフラグは、通常、問題を深く判断する唯一の方法であるため、運用システムでは必須です。

ヒープ ダンプは、デフォルトで JVM の「現在のディレクトリ」にセットアップされます。特定のディレクトリにヒープダンプを作成したい場合は、次のコマンドを実行します。

 -XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"

ヒープ ダンプ ファイルのサイズは最大でギガバイトに達する可能性があるため、ターゲット ファイル システムに十分な容量があることを確認してください。

メモリ不足が発生した直後にサーバーを再起動したい場合は、同じ目的でこのパラメータを設定できます。

 XX:OnOutOfMemoryError="shutdown -r"

クラスのロードとアンロードをトレースする

-XX:+TraceClassLoading -XX:+TraceClassUnloading 、クラスが JVM にロードされるとき、または JVM からアンロードされるときにログ情報を出力するために使用する 2 つの JVM オプションです。これらの JVM フラグは、クラスローダーに関連する何らかのタイプのメモリ リークがあり、クラスがアンロードまたはガベージ コレクションされていないことが疑われる場合に役立ちます。

Java クラスパス

JAVA クラスパスについて話すと、 -Xbootclasspath 検証なしでロードするクラスパス エントリを指定します。 JVM は、ロードするすべてのクラスを検証して、int を使用したオブジェクトの参照解除、スタックからの余分なエントリのポップ、多すぎるエントリのプッシュなどが試行されていないかどうかを確認します。

クラスをブートクラスパスに置くとコストも節約されますが、クラスが以前に何度も検証されていることがわかっている場合にのみ使用してください。 JRuby では、これにより、単純なスクリプトの場合、起動時間が半分以上短縮されました。

プロファイリング

Java プロファイリングは、メソッドの実行、スレッドの実行、ガベージ コレクション、オブジェクトの作成など、さまざまな JVM レベルのパラメーターを監視するプロセスです。 Java プロファイリングでは、ターゲット アプリケーションの実行とそのリソースの使用状況をより詳細に把握できます。

 -Xprof 
-Xrunhprof

64ビット環境

32 ビットと 64 ビットの両方のパッケージがインストールされている OS 環境では、JVM はデフォルトとして 32 ビット環境パッケージを自動的に選択します。

環境を手動で 64 ビットに設定したい場合は、 -d<OS bit> パラメータを使用して設定できます。そして明らかに、OS ビットは 32 または 64 のいずれかになります。

結論

これがアプリケーションの JVM パラメータの設定に役立つことを願っています。 Javaメモリ管理について詳しく学びたい場合は、この Udemyコース をチェックしてください。

「実稼働 Java アプリケーション システム用の 10 の重要な JVM オプション」についてわかりやすく解説!絶対に観るべきベスト2動画

【Track C-6】Azure 上で Java アプリケーションを動かそう!JBoss® EAP on ARO
【Track A-1】Java は今どこに向かっているのか