41.4. OpenShift Container Platform での OpenJDK のサイジング
デフォルトの OpenJDK 設定はコンテナー化された環境では機能しません。 コンテナーで OpenJDK を実行する場合は常に追加の Java メモリー設定を指定することがルールとなっているためです。
JVM のメモリーレイアウトは複雑で、バージョンに依存しており、本書ではこれについて詳細には説明しません。ただし、コンテナーで OpenJDK を実行する際のスタートにあたって少なくとも以下の 3 つのメモリー関連のタスクが主なタスクになります。
- JVM 最大ヒープサイズを上書きする。
- JVM が未使用メモリーをオペレーティングシステムに解放するよう促す (適切な場合)。
- コンテナー内のすべての JVM プロセスが適切に設定されていることを確認する。
コンテナーでの実行に向けて JVM ワークロードを最適に調整する方法については本書では扱いませんが、これには複数の JVM オプションを追加で設定することが必要になる場合があります。
41.4.1. JVM 最大ヒープサイズの上書き
数多くの Java ワークロードにおいて、JVM ヒープはメモリーの最大かつ単一のコンシューマーです。現時点で OpenJDK は、OpenJDK がコンテナー内で実行されているかにかかわらず、ヒープに使用されるコンピュートノードのメモリーの最大 1/4 (1/-XX:MaxRAMFraction
) を許可するようデフォルトで設定されます。そのため、コンテナーのメモリー制限も設定されている場合には、この動作をオーバーライドすることが 必須 です。
上記を実行する方法として、2 つ以上の方法を使用できます:
コンテナーのメモリー制限が設定されており、JVM で実験的なオプションがサポートされている場合には、
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
を設定します。これにより、
-XX:MaxRAM
がコンテナーのメモリー制限に設定され、最大ヒープサイズ (-XX:MaxHeapSize
/-Xmx
) が 1/-XX:MaxRAMFraction
に設定されます (デフォルトでは 1/4)。-XX:MaxRAM
、-XX:MaxHeapSize
または-Xmx
のいずれかを直接上書きします。このオプションには、値のハードコーディングが必要になりますが、安全マージンを計算できるという利点があります。