web-dev-qa-db-ja.com

設定-XX:MaxRam

この link によると、MaxRamSizeを手動で設定してJVMがこれ以上のメモリを使用しないように制限するオプションがあります。しかし、私は同じもののドキュメントを見ていません。私はこれを知らなかった。これと似たようなものはありますか? PS。ヒープ/スタック/メタスペース/ネイティブメモリサイズを設定するつもりはありません。全体的なメモリ制限オプションがあるかどうかを知りたいだけです。

エラーになったため、試してみても役に立ちませんでした。

Improperly specified VM option 'MaxRAM=1073741824B'
Could not create the Java Virtual Machine.
A fatal exception has occurred. Program will exit.

事実によると link open-jdkにはこれらのオプションがあるようです。別の リンク ヒープサイズを設定するポイントを信じていることがわかりました。これも探していません。しかし、これはOracle向けです。

コンテナ内でアプリケーションを実行し(Dockerのように)、OOM Killerによってアプリケーションが強制終了されないようにするこの種のオプションを探しているのはなぜですか。このようなJavaアプリケーションがJava.lang.OutOfMemoryErrorむしろ、終了するコンテナではありません。

私の仮定と理解は全く間違っているかもしれません。この質問もまったく間違っていて、無関係かもしれません。しかし、もちろん、尋ねることは前進の道です:)。

9
Vipin Menon

Javaは「B」について不平を言っていると思います。手動入力によると、Javaコマンドはk/Kまたはm/Mまたはg /を理解しますGサイズの接尾辞。 「B」には言及していません。

(エラーメッセージが「不明」ではなく「不適切に指定されました」ということに気づきましたか?Javaコマンドがオプションを認識したが、構文が間違っていることを示唆しています。上記を参照してください...)

Java 11のOpenJDKソースコードを見ると、 "gc_globals.hpp"ファイルで定義されているMaxRAMパラメーターがわかります。

2
Stephen C

コンテナ内でアプリケーションを実行し(Dockerのように)、OOM Killerによってアプリケーションが強制終了されないようにするこの種のオプションを探しているのはなぜですか。

これはまさにあなたが探しているオプションです。さらに、 JDK-8170888 の一部としてcgroups(〜docker)と適切に統合されました。このフラグは、JVMがその値よりも多くのメモリを割り当てることを妨げるものではなく、「物理RAM制限はXです。X内で割り当ててください。 Javaヒープとネイティブメモリの間の値。ただし、アプリケーションにネイティブメモリリークまたはクラスローダリークがある場合、いずれにしてもこの制限に達します。

JVMは、最後にBを期待していないため、_MaxRAM=1073741824B_で文句を言っています。-XX:MaxRAM=1073741824_として宣言する必要があります。 説明 フラグのReal memory size (in bytes) used to set maximum heap sizeを参照してください。

1
qwwdfsad

参照を見つけました

https://chriswhocodes.com/hotspot_options_jdk11.html?s=MaxRam

しかし、スティーブンCが示唆しているように、おそらくB

注:これは、デフォルトのヒープおよびダイレクトメモリの最大値を計算するために使用される最大RAMサイズです。これ以上の強制はありません。

最大ヒープサイズの設定に使用される実メモリサイズ(バイト単位)

そして別のパラメータ用

人間工学的に設定された最大ヒープサイズ(バイト単位)。 [デフォルト]ゼロは、MaxRAM * MaxRAMPercentage/100を使用することを意味します


Oracle/OpenJDKには明らかなオプションはありません。

$ Java -version -XX:+PrintFlagsFinal | grep -i MaxRAM

ただし、Linuxではulimitを使用して最大メモリサイズを設定できますが、これに達するとJVMがハードクラッシュします。

1
Peter Lawrey