JVMの適切な設定を取得するのに苦労しています。
ユースケースは次のとおりです。Tomcatはリクエストを処理しています(300req / s)。ただし、これらは非常に高速(Key-Valueルックアップ)であるため、パフォーマンスの問題はありません。3時間ごとに提供されているデータを更新する必要があるまで、すべてが正常に機能します。あなたは私が大きなHashMapを持っていて、ルックアップをしているだけだと想像することができます。データのリロード中に一時的なHashMapを作成し、それを交換します。かなりの量のデータをロードする必要があります(毎回メモリに最大800MB)。
私が抱えている問題は、これらのロード中に時々Tomcatが応答を停止することです。当初の問題はプロモーションの失敗とFullGCでしたが、設定を調整することでこれらの問題を回避しました。
お気づきかもしれませんが、CMSコレクターが起動したときに、すでに値を下げています。プロモーションの失敗などはもう発生しません。若い世代は、マイナーコレクションを高速化するために適度に小さいです。すべてのリクエストオブジェクトが若くして消滅し、昇格されないものは自動的に古い世代にプロモートされるため、SurvivorRatioを増やしました(データが読み込まれています)。
しかし、データのロード中にTomcatで503エラーが発生します。gc.logでは、このプロセス中にマイナーコレクションが遅くなり始めました。ミリ秒と比較して、秒単位になりました。ロードプロセスを遅くしてGCに息抜きを与えようとしましたが、うまくいかないようです...この問題は、古い世代の容量に達した瞬間に特に問題になります。CMSが起動し、メモリを解放すると、後で割り当てがかなり遅くなります。gc.logにエラーは表示されなくなりました。何が違うのですか?断片化が問題になる可能性があることは知っていますが、プロモーションが失敗することはありません。マシンは8コアサーバーです。GCThreadの数を減らすことは意味がありますか?データ読み込みスレッドに低いスレッド優先度を設定することは意味がありますか?
バックグラウンドで定期的にCMSコレクターを開始する方法はありますか?スワップされているデータは、実際にはすぐにガベージコレクションされる可能性があります。
私はどんな提案にもオープンです!
これが私のJVM設定です。
-Xms14g
-Xmx14g
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+AlwaysPreTouch
-XX:MaxNewSize=256m
-XX:NewSize=256m
-XX:MaxPermSize=128m
-XX:PermSize=128m
-XX:SurvivorRatio=24
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=88
-XX:+UseCompressedStrings
-XX:+DisableExplicitGC
JDK 1.6.33 Tomcat 6
gc.logスニペット:
7行目データの読み込みが開始されます
20行目停止します