2012-03-22 14 views
1

ユーザーにアクセスできないプロセスを実行するサーバーがあります。したがって、スループットは重要ではありません。ほとんどの場合、サーバーは小さなジョブしか実行しないため、ほとんどの場合、主にマイナーGCを実行します。たまには、大きな仕事が必要になります。そのため、プロセスのためのスペースを確保するために大規模なGCが必要になります。私は数日間、決して主要なgcをしたことがないようなケースを見てきました。Javaメインガベージコレクションをより頻繁に調整する方法

私の問題は、主要なgcが実行され、一時停止し、ヘルスチェックアラートを引き起こすときです。私たちはヒープサイズを小さくしようとしましたが、問題はなくなりました。しかし、大きな仕事が来ると、それは記憶がなくなります。ヘルスチェックのタイムアウトを増やしたくないので、必要なときに待機するのではなく、ヒープサイズが大きくてもgcが頻繁に発生するようにgcをチューニングする必要があります。私は-XX:+UseConcMarkSweepGCを使用して、より低い影響を一時停止するように変更する予定です。他のJVMオプションも試してみるべきですか?

+1

メモリリークを修正するのはなぜですか? – mre

+3

マークと掃引?それはGCの古いアルゴリズムではありませんか?私は世代モデルがより良いと思っていたでしょう。 – duffymo

+0

多くのオブジェクトはリクエストのサービスの外で生き残る必要があるため(ほとんどの場合、小規模/素早い)、児童死亡率が高いはずです。 – Dunes

答えて

0

"大きな仕事"が他の仕事で適切に働くと、より積極的なgcがあなたの健康チェックを引き起こします。私が言いたいのは、メモリをどのように解放してもタイミングの問題であり、最後のリファレンスがリリースされた直後にすべてをクリーニングしても実行できるということです。 あなたのヘルスチェックが過敏に設定されていると思います。

アイドル状態でジョブキューが空の場合でも、System.gc()に電話をかけることができます。しかし、それを推薦として扱わないでください。これは、パフォーマンスを改善するよりも、パフォーマンスを損なう可能性が最も高いです。

0

-XX:+UseParallelGCオプションを使用しているときにこのような問題が発生しましたが、これは比率が古いものに比べてあまりにも大きかったためです。これは、大きな古い世代と小さすぎる新しい世代があることを意味しました。オブジェクトは削除されるのに十分長い間新しい状態に留まらないので、古いオブジェクトはゆっくりといっぱいになって大きなコレクションを生成します。

新しい比率を高く設定すると、私たちは助けてくれました(-XX:NewRatio=2)。私が使用した価値は覚えていませんが、2〜3であると思います。
短い世代のオブジェクトが古い世代に強制される前に削除される可能性があるように、これはより大きな若い世代を設定します。

0

設定が間違っています。 あなたはこう言いました。スループットは問題ありません。ユーザーが接続していないからです。これは間違っています。ユーザーが接続すると、応答性が重要になります。そうでない場合、スループットは重要です。 「ユーザーへのアクセスがない」という前提も間違っています。あなたは、健康診断者であり、アクセスが必要なユーザーがいます。

バッチジョブで推奨されるのは、スループットに最適化されたGC設定を維持し、より長いメジャーGCで生きることです。 おそらくヘルスチェッカーはあなたのサービスをチェックするためのより良い手段を持っていて、それがGCの上に落ちないように頑強にすることができますか?

関連する問題