2013-10-23 8 views
6

私はデータを失うことは望まないし、同時に外部依存(たとえばDBのような)のためにこのサービスを失敗させる必要があるので、メモリ内の呼び出しをすべて段階的に実行するサービスを持っています。 。これらのステージングされたコールは、通常、バックグラウンドでピックアップされ、処理されます。Javaのコレクションが容量を超えて増加するとどうなりますか?

何らかの理由で、コールが多すぎてメモリが不足している場合は、警告する必要があります。

質問:リソースが不足してリストに追加が失敗したときに通知または通知するには、どのような例外を検出する必要がありますか? VM自体にOOMが発生するのでしょうか、それともコレクションレベルの制限がありますか?

コレクションレベルの制限がない場合は、サービスの使用状況をどのように監視することをおすすめしますか?現在、ヒープ使用量とメモリ使用量のメトリックがあります。それらは十分ですか?また、JVMはOOMエラーでkillするように設定されています(これは、VM Managerがkillで管理しているプロセスを再起動するためです)。

+0

メモリの面では、あなたはOOMEを取得します。コレクションに入る要素を制限したい場合は、それを自分で実装する必要があります。 – Cruncher

+0

私はこのような状況を避けるべきです。まず、ファイルベースのキャッシュを使用します。 –

+0

テストするのは簡単だと思われます。無限ループ内でコレクションにアイテムを追加し、何が起こるかを確認する単純なアプリケーションを作成します。 – Eran

答えて

4

スローされる例外はOutOfMemoryExceptionです。この例外は、コレクションが使用可能なヒープ領域をすべて消費すると、アプリケーションのどの部分でもスローされます。

特定のコレクションに対してスローされる可能性があることがわかっている場合は、このコレクションをキャップするかキャッシングを使用して、未使用のエンティティを強制的に削除して再ロードすることをおすすめします。軽量キャッシュの実装では、GuavaのCacheBuilderをお勧めします。

UPDATE

誰もがFSベースのストレージを示唆しているので、ここで私の軽量ドロップで提案です:

  • CacheBuilder変換するNoSQLのDBから
  • Kryoシリアライザをあなたのシリアル化されたデータをロードしますあなたのオブジェクトをbyte[]
  • MapDB(またはその他の組み込みNoSQLソリューションのyoあなたは好きです)。
+0

これまでのすべての回答は素晴らしかったですが、悲しいかな、私は1つしか選択できません。この投稿はすべてを要約しているので、私はこれを正しいものとしてマークしています。時間をいただきありがとうございます! –

+0

ありがとうございました! –

2

ここで私はCollection.addの仕様で見つけたものです:

コレクションは、それがすでに要素が含まれていること以外の理由で特定の要素を追加することを拒否した場合、それはむしろ、(例外をスローする必要がありますfalseを返すよりも)。これにより、この呼び出しが返った後にコレクションに常に指定された要素が含まれるという不変量が保持されます。

どの例外を指定するのではなく、異なるコレクションによって異なる例外が発生する可能性があります。

+0

データが追加されたかどうかを確認することが重要であるため、通知されていることは念頭に置くべきことです。 –

2

私はアプリケーションを悲惨に失敗させることは理想的な設計選択ではないと思います。その場合は、どこかに(ディスク?)、通知(JMX /電子メール)、エラーをスローする(またはOOMEを伝播させる)など、コレクションのサイズにしきい値を設定し、その場合の対処方法を決定する必要があります。

しかし、私はあなたにデザインの推奨を与えるつもりです。あなたのサービスの簡潔で微妙な説明から、あなたのサービスのの外にあるの外に座る作業待ち行列が必要なように私に聞こえます。、JMSサーバ、さらにはデータベースですらあります。このようにして、バックグラウンドプロセスは、キュー(db)から要求を取得し、何らかの理由でサービスが停止した場合でもその要求を処理できます。

+0

完全に意味があり、間違いなく正しい方法です。しかし、DBの代わりに、FSベースのストレージを使用しています(外部依存関係の速度低下は、データを失うことよりも大きな懸念です。データ損失の発生は問題ありません)。時間をとってくれてありがとう –

関連する問題