web-dev-qa-db-ja.com

JavaフラグXmsおよびXmxはフラグXX:+ UseCGroupMemoryLimitForHeapを上書きしますか?

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はどのくらいのメモリを予約しますか?

6
Dimitrios

-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/

2
Chris

このように考えてくださいbeforeUseCGroupMemoryLimitForHeapが追加された場合、Xmxをポッドの値よりも大きい値で指定できます(ホストでのみ表示されます)ポッド自体ではなくメモリ)、最終的に殺されます。指定しない場合、デフォルトではメモリの1/4でした。これは、ヒープが次のように計算されるために発生します。

heap = memory / MaxRAMFraction

実行中:

Java -XX:+PrintFlagsFinal | grep MaxRAMFraction

MaxRAMFraction = 4

UseCGroupMemoryLimitForHeapが追加されたので、ヒープポッドから自体がどれだけのヒープを取得するかを確認できます。デフォルトでは、まだ1/4です。もちろん、MaxRAMFractionで調整できます。

両方の引数を指定すると、Xmsが優先されます。常に。そして1)これはかなりのロジックです(UseCGroupMemoryLimitForHeapXmxよりも具体的です)2)これは今の私の実験で正確に証明されています。指定された順序に関係なく、Xmxが常に優先されます。

2
Eugene