Swisscom Cloud にデプロイ可能な Java アプリケーションがあります。1.5 G の RAM を持つインスタンス。CF の次のパラメーターを使用して、このアプリのメモリ使用量を制限しています。
[jre: { version: 1.8.0_+ }, memory_calculator: {memory_sizes: {stack: 228k},
memory_heuristics: {heap: 50, metaspace: 20, native: 50, stack: 10}}]
インスタンスの下で、実行すると次のps -ef | grep java
ようになります。
-Xms611500K -XX:MetaspaceSize=244600K -Xmx611500K -XX:MaxMetaspaceSize=244600K -Xss228
-XX:MaxDirectMemorySize=256m -XX:InitialCodeCacheSize=32m -XX:ReservedCodeCacheSize=64m
-XX:CompressedClassSpaceSize=250m -XX:+UseCompressedOops -XX:+UseCompressedClassPointer
残念ながら、しばらくするとアプリ プロセスが強制終了されます ("Exit with status 137")。CF の別の設定を試してみましたが、うまくいきませんでした。使用メモリを制限しているにもかかわらず、常に 1.5 ギガの RAM が不足しています。
2016-11-10T14:31:08.34+0200 [API/0] OUT App instance exited with guid
72a197e9-e222-43b5-9828-9553c1d58315 payload: {"instance"=>"", "index"=>0,
"reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s)
occurred:\n\n* Exited with status 137 (out of memory)\n* cancelled\n* cancelled",
"crash_count"=>1, "crash_timestamp"=>1478781068233690142,
"version"=>"ebfced51-9973-434b-8ec0-79a8caa86b3b"}
クラッシュする前に、New Relic を使用してヒープ メモリの使用状況を分析していました。
ここで、4時半頃の出来事Exited with status 137 (out of memory)
。ご覧のとおり、メモリの超過はまったくありませんでした。
クラッシュする前に cf インスタンスでコマンドを実行するとtop
、次の結果が得られました。
7 vcap 10 -10 6160764 1.357g 22528 S 27.3 7.4 3:09.52 java
実際に何が間違っている可能性がありますか?Java プロセスが実際に約 1.4G の RAM を使用したことがわかりましたが、New Relic グラフからは、それほど大量のメモリが使用されていません。