Java 仮想マシン ( JVM ) ヒープがメモリを過剰に占有している場合、次の状況が発生する可能性があります。JVM が Linux OS で実行されている場合、Java プロセスが Linux のメモリ不足 ( OOM ) キラーによって強制終了される可能性があります。 JVM が Docker コンテナで実行されている場合、コンテナインスタンスが頻繁に再起動される可能性があります。このトピックでは、コンテナ環境で実行されている JVM のメモリ構成に関する推奨事項と、OOM に関する FAQ を提供します。
(推奨) -XX:MaxRAMPercentage オプションを使用して、JVM によって使用されるコンテナメモリの最大割合を指定します
コンテナ環境では、次の JVM オプションを推奨します。
-XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof次の表に、JVM オプションを示します。
オプション | 説明 |
| OS 全体ではなく、JVM が配置されているコンテナのメモリサイズとプロセッサ数を検出するためのオプションです。 JVM は、リソース割り当てに上記の検出された情報を使用します。たとえば、 |
| JVM が使用できるコンテナメモリの初期割合を指定するためのオプションです。このオプションと |
| JVM が使用できるコンテナメモリの最大割合を指定するためのオプションです。システムコンポーネントに必要なオーバーヘッドのため、このオプションを 75.0 以下の値に設定することをお勧めします。推奨値は 70.0 で、JVM がコンテナメモリの最大 70% を使用できることを示します。 |
| GC の詳細を出力するためのオプションです。 |
| GC のタイムスタンプを出力するためのオプションです。タイムスタンプの例:2019-12-24T21:53:59.234+0800 |
| GC ログの出力パスを指定するためのオプションです。このオプションを構成する前に、ログを格納するためのコンテナディレクトリがあることを確認してください。コンテナディレクトリを NAS ディレクトリにマウントするか、Simple Log Service を使用してログを格納することをお勧めします。こうすることで、ディレクトリが自動的に作成され、ログの永続ストレージが有効になります。 |
| JVM で OOM エラーが発生した場合に、ダンプファイルの自動生成を有効にするためのオプションです。 |
| ダンプファイルを格納するパスを指定するためのオプションです。このオプションを構成する前に、ダンプファイル用のコンテナディレクトリがあることを確認してください。コンテナディレクトリを NAS ディレクトリにマウントすることをお勧めします。こうすることで、ディレクトリが自動的に作成され、ログの永続ストレージが有効になります。 |
-XX:+UseContainerSupportオプションは、JDK 8u191+ および JDK 10 以降を使用する場合にのみ有効です。-XX:+UseContainerSupportオプションは、一部の OS でのみサポートされています。詳細については、ご使用の Java バージョンの公式ドキュメントをご参照ください。JDK 11 以降のバージョンでは、次のログオプションは非推奨になりました:
-XX:+PrintGCDetails、-XX:+PrintGCDateStamps、および-Xloggc:$LOG_PATH/gc.log。-Xlog:gc:$LOG_PATH/gc.logオプションを使用することをお勧めします。Dragonwell 11 は、
${POD_IP}変数をサポートしていません。/home/admin/nas コンテナディレクトリを NAS ディレクトリにマウントしない場合は、アプリケーションの起動前にコンテナディレクトリが存在することを確認してください。存在しない場合、ログは生成されません。
-Xms および -Xmx オプションを使用してヒープサイズを管理する
-Xmsおよび-Xmxオプションを使用して、ヒープサイズを管理できます。次の項目に注意してください。インスタンスの仕様を調整した後、-Xmx オプションを再構成する必要があります。
パラメータ設定が適切でない場合、アプリケーションメモリが JVM ヒープサイズの上限に達していなくても、OOM エラーによりコンテナが強制的にシャットダウンされる可能性があります。詳細については、「コンテナに終了コード 137 が表示された場合はどうすればよいですか?」をご参照ください。
次の JVM オプションを構成することをお勧めします。
-Xms2048m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof次の表に、JVM オプションを示します。
オプション
説明
-XmsJVM の初期ヒープサイズを指定するためのオプションです。ガベージコレクションのたびにヒープサイズが再割り当てされないように、-Xms と
-Xmxオプションを同じ値に設定することをお勧めします。-Xmx最大ヒープサイズを指定するためのオプションです。コンテナでの OOM エラーを防ぐために、システムの実行に十分なメモリサイズを確保することをお勧めします。
-XX:+PrintGCDetailsGC の詳細を出力するためのオプションです。
-XX:+PrintGCDateStampsGC のタイムスタンプを出力するためのオプションです。タイムスタンプの例:2019-12-24T21:53:59.234+0800
-Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').logGC ログの出力パスを指定するためのオプションです。このオプションを構成する前に、ログを格納するためのコンテナディレクトリがあることを確認してください。コンテナディレクトリを NAS ディレクトリにマウントするか、Simple Log Service を使用してログを格納することをお勧めします。こうすることで、ディレクトリが自動的に作成され、ログの永続ストレージが有効になります。
-XX:+HeapDumpOnOutOfMemoryErrorJVM で OOM エラーが発生した場合に、ダンプファイルの自動生成を有効にするためのオプションです。
-XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprofダンプファイルを格納するパスを指定するためのオプションです。このオプションを構成する前に、ダンプファイル用のコンテナディレクトリがあることを確認してください。コンテナディレクトリを NAS ディレクトリにマウントすることをお勧めします。こうすることで、ディレクトリが自動的に作成され、ログの永続ストレージが有効になります。
次の表に、推奨されるヒープサイズの設定をいくつか示します。
メモリサイズ
JVM ヒープサイズ
1 GB
600 MB
2 GB
1434 MB
4 GB
2867 MB
8 GB
5734 MB
JDK 11 以降のバージョンでは、次のログオプションは非推奨になりました:
-XX:+PrintGCDetails、-XX:+PrintGCDateStamps、および-Xloggc:$LOG_PATH/gc.log。-Xlog:gc:$LOG_PATH/gc.logオプションを使用することをお勧めします。Dragonwell 11 は、
${POD_IP}変数をサポートしていません。/home/admin/nas コンテナディレクトリを NAS ディレクトリにマウントしない場合は、アプリケーションの起動前にコンテナディレクトリが存在することを確認してください。存在しない場合、ログは生成されません。
ossutil を使用してダンプファイルをダウンロードする
コンテナディレクトリを NAS ディレクトリにマウントします。詳細については、「NAS ストレージを構成する」をご参照ください。
JVM オプションを構成します。
/home/admin/nas コンテナディレクトリは NAS ディレクトリにマウントされ、ダンプファイルが格納されます。
-Xms2048m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprofアプリケーションで OOM エラーが発生した場合、ダンプファイルが生成され、/home/admin/nas ディレクトリに格納されます。 ossutil ツールを使用して、ダンプファイルをオンプレミスマシンにダウンロードし、ダンプファイルを分析できます。詳細については、「ログをアップロードおよびダウンロードしてアプリケーションのヘルスステータスを確認する」をご参照ください。
FAQ
コンテナに終了コード 137 が表示された場合はどうすればよいですか?
使用されているコンテナメモリが上限に達すると、コンテナで OOM エラーが発生する可能性があります。これにより、コンテナが強制的にシャットダウンされる可能性があります。この場合、JVM ヒープサイズの上限に達していないと、ダンプファイルは生成されません。システムコンポーネントを実行するための十分なメモリを確保するために、JVM ヒープサイズの上限を下げることをお勧めします。
OOM が発生したが、ダンプファイルが生成されない場合はどうすればよいですか?
OOM キラーメカニズムがトリガーされると、JVM で OOM エラーが発生しない場合があります。この場合、ダンプファイルは生成されません。次の方法を使用して、この問題を防ぐことができます。
Java アプリケーションの場合は、JVM ヒープサイズを小さくすることができます。詳細については、このトピックの関連する手順をご参照ください。
Java 以外のアプリケーションの場合は、インスタンスの仕様を調整して、十分なメモリリソースを確保できます。詳細については、「アプリケーションのインスタンスの仕様を変更する」をご参照ください。
ヒープサイズとメモリサイズを同じ値に設定できますか?
いいえ、システムコンポーネントのオーバーヘッドがあるため、ヒープサイズとメモリサイズを同じ値に設定することはできません。たとえば、Simple Log Service を使用してログを収集する場合、少量のメモリが消費されます。システムコンポーネント用に十分なメモリを確保する必要があります。詳細については、「Simple Log Service へのログ収集を構成する」をご参照ください。
JDK 8 で XX:MaxRAMPercentage オプションを整数に設定するとエラーが発生するのはなぜですか?
これは JDK 8 特有のバグです。詳細については、「Java Bug Database」をご参照ください。シナリオ例:JDK 8u191 で XX:MaxRAMPercentage オプションを 70 に設定すると、JVM の起動時にエラーが発生する可能性があります。
解決策:
解決策 1:
-XX:MaxRAMPercentageオプションを70.0に設定します。説明-XX:InitialRAMPercentageまたは-XX:MinRAMPercentageオプションを使用する場合、値を整数に設定することはできません。解決策 1 に従ってオプションを構成してください。解決策 2:JDK をバージョン 10 以降にアップグレードします。
JVM ヒープサイズを 6 GB に設定した場合、メモリ使用量が低いのはなぜですか?
-Xms6g -Xmx6g オプションを構成した場合、OS は 6 GB の物理メモリをすぐに割り当てるのではなく、メモリが実際に使用された後にのみ物理メモリを割り当てます。アプリケーションの起動時はメモリ使用量が比較的低く、後で増加します。