Kubernetesでコンテナ化されたJavaアプリケーションを実行しています。
コンテナの仕様に従ってjvmがメモリを予約するために、フラグ-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
を設定する必要があります。
これらのフラグが両方ともXmsおよびXmxフラグとともに設定されている場合、jvmの動作はどうなりますか? 1つのフラグが他のフラグを上書きしますか?
たとえば、Java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xms -Xms2500M -Xmx2500M -jar myjar.jar
コンテナを備えたポッドでは、リクエスト用に4Gi、レスポンス用に4Giを制限します。128Giメモリを搭載したホストマシンでは、JVMはどのくらいのメモリを予約しますか?
-Xmxフラグは、-XX:+ UseCGroupMemoryLimitForHeapフラグを上書きします。
フラグ-XX:+ UseCGroupMemoryLimitForHeapを使用すると、JVMはコンテナー内の最大ヒープサイズを検出できます。
-Xmxフラグは、最大ヒープサイズを固定サイズに設定します。
この例に答えるために、JVMは2500Mのヒープスペースを予約します。非ヒープおよびjvmの場合、追加のメモリ使用量がいくつかあります。
コンテナのメモリ使用量をさらに調整するには、-XX:MaxRAMFractionフラグを使用できます。この記事を参照してください: https://blog.csanchez.org/2017/05/31/running-a-jvm-in-a-container-without-getting-killed/
このように考えてくださいbeforeUseCGroupMemoryLimitForHeap
が追加された場合、Xmx
をポッドの値よりも大きい値で指定できます(ホストでのみ表示されます)ポッド自体ではなくメモリ)、最終的に殺されます。指定しない場合、デフォルトではメモリの1/4でした。これは、ヒープが次のように計算されるために発生します。
heap = memory / MaxRAMFraction
実行中:
Java -XX:+PrintFlagsFinal | grep MaxRAMFraction
MaxRAMFraction = 4
。
UseCGroupMemoryLimitForHeap
が追加されたので、ヒープポッドから自体がどれだけのヒープを取得するかを確認できます。デフォルトでは、まだ1/4です。もちろん、MaxRAMFraction
で調整できます。
両方の引数を指定すると、Xms
が優先されます。常に。そして1)これはかなりのロジックです(UseCGroupMemoryLimitForHeap
はXmx
よりも具体的です)2)これは今の私の実験で正確に証明されています。指定された順序に関係なく、Xmx
が常に優先されます。