私のJavaプログラムは、メモリが指定された量に制限されている環境で実行する必要があります。 Javaサービスを実行すると、起動時にメモリが不足します。これは私が設定しています私が使用しているコマンドと値の一例であるulimitをjavaで正しく使用するには?
:理論的には
ulimit -Sv 1500000
java \
-Xmx1000m -Xms1000m \
-XX:MaxMetaspaceSize=500m \
-XX:CompressedClassSpaceSize=500m \
-XX:+ExitOnOutOfMemoryError \
MyClass
を、私は上のドキュメントを見つけることができるすべてを占めてきました。ヒープ(1000m)とメタスペース(500m)があります。しかし、JVMの初期化時にメモリ不足になります。これは、約600mibをヒープ+メタスペースよりも大きく設定するまで発生します。
私がulimitを適切に設定できるように、どのような種類のメモリがありますか?
使用例:メモリが制限されたDockerコンテナでタスクを実行しています。これは、Linuxのcgroupが制限を行っていることを意味します。メモリの制限を超えると、cgroupはその制限を超えるプロセスを一時停止または強制終了することができます。私は実際に何かがうまくいかず、それがラップするbashスクリプトがタスクのイニシエータにエラーを報告できるように、あまりにも多くのメモリを使用する場合、Javaプロセスが正常に失敗するようにします。
私たちはjava 8を使用しているので、permgenの代わりにmetaspaceについて心配する必要があります。
更新:OutOfMemoryError
で死ぬことはありません。これはエラーです:
Error occurred during initialization of VM
Could not allocate metaspace: 524288000 bytes
メモリが足りなくなり、 'cgroups'によって殺されるか、メモリが足りなくなり、' OutOfMemoryError'がスローされますか? – EJP
Javaは 'OutOfMemoryError'で終了します。私は質問を更新しました。 – tombrown52
それはあなたがしたいことをやっている。 'cgroups'の制限内で実行可能なJavaメモリ引数を見つけるだけでいいです。それがなければ、あなたはそれをすることができません。 – EJP