2009-05-15 3 views
2

いくつかのテストを行うために、SoftReferenceのオブジェクトのキャッシュに保存されているオブジェクトの一部またはすべてが破棄されたときに、アプリケーションの動作を確認したいと思います。Javaのオブジェクトが柔らかく到達可能かどうかを判断する方法はありますか?

これを実行するには、キャッシュされたSoftReferenceオブジェクトに格納されている参照を手動でクリアする必要があります(これらのオブジェクトのVMの処理をシミュレートします)。別のプロセスがキャッシュから参照されたオブジェクトを最近取り込んだ場合)。

私のアプリケーションはシングルスレッドなので、このコードが実行されているときにキャッシュされたオブジェクトのソフト到達可能性について心配する必要はありません。これは、現在私がロック機構を持っていないことを意味しています - もし私が持っていたなら、オブジェクトが「使用されている」かどうかを判断するためにこれらを使用した可能性があります。そのようなロックの。

私が試みた1つのアプローチは、ReferenceQueueで登録されたキャッシュに格納されたすべてのオブジェクトに追加のSoftReferenceを作成することです。私が望むことは、キャッシュ内の柔らかく到達可能なすべてのオブジェクトが、追加のSoftReferenceをキューに追加することでした。したがって、キューをループしてキャッシュからオブジェクトを削除するだけでした。しかし、GCは余裕をもって到達可能なオブジェクトをそれぞれのキューにエンキューするように見えるので、キャッシュ内のオブジェクトの繰り返し処理が完了すると、キューに何かが追加されることは保証されません。

私が見てきたことの1つは、非常に小さな値を持つ-XX:SoftRefLRUPolicyMSPerMB JVMオプションです。賢明なメモリ割り当てでは、これはキャッシュの中の弱く到達可能なオブジェクトを私には届きにくいものにするでしょうが、キャッシュから柔らかく到達可能なオブジェクトをクリアする要求を受け取るまで、アプリケーションを正常に実行したいと思います。 JVMのオプションとして、私は私のアプリが実行されている間、私はこの値を変更することができるとは思わない。

だから、どのように私はオブジェクトが唯一の到達可能な(したがって、クリアすることができます)かどうかを判断することができますか?

編集:

  • アプリは、おそらく私は、これらはそっと出てオブジェクトを参照クリアしたいタイミングで有用な作業をやってます:明らかにされていない可能性がありいくつかの余分なポイント。だから私はGCが私のためにオブジェクトをクリアしようとしないようにしたいと思う。
  • どのソフトに到達可能なオブジェクトが消去されたのかを選択できるとよいでしょう。
  • 正常に動作するように、つまり本番メモリの設定を使用してアプリを使用したいと思います。コード内の設定を変更すると、その値をプロダクション値に戻すことができます。

答えて

0

いくつかの答えを混合:

private void doOutOfMemory() { 
    try { 
     List<byte[]> list = new ArrayList<byte[]>(); 
     while (true) { 
      list.add(new byte[200 * 1024 * 1024]); 
     } 
    } catch (OutOfMemoryError ex) { 
    } 
} 

あなたがオブジェクトがクリアされるかを制御するためにwan't場合は、上の強い参照を取る:トムホーティンはあなたがのOutOfMemoryを行くまで、このコードで、たとえば、メモリを割り当てる言ったようにあなたが保持したいオブジェクト。

この*は*どんなそっと参照されるオブジェクトのキャッシュをクリアしますけれどもあなたはまた、私は、

+0

すべての要件を満たしているわけではありませんが、私は行くつもりです。 – Cyphus

1

IIRC、ソフト参照はOutOfMemoryErrorがスローされる前にクリアされるように(ある意味で)が保証されています。したがって、たくさんのメモリを割り当てると、オブジェクトが強く参照されていなければクリアされるはずです。 (テストされていません)

+0

...代わりにweakReferencesを使用してのみ、彼らは常にクリアされます保証はありませんクリアするためにSystem.gc()を呼び出すことができますメモリがいっぱいにならないようにするのが好きです。アプリが同時に役に立つ仕事をしている可能性があり、パフォーマンスに影響を与えたくないからです。私はOutOfMemoryエラーの原因となるほどのものではなく、参照がクリアされるように十分なメモリを割り当てることのバランスをとる必要があります。さらに、これは私がどのオブジェクトを選択するのかを選択させることはできません。 – Cyphus

0

現在のソフトリファレンスシステムをテスト中に置き換えてください。

弱参照系は、jvmがガベージコレクションを実行するのを待つのではなく、すぐに他の受信参照がないオブジェクトを削除します。

+0

いいえ、常にオブジェクトを削除するまでGCを待たなければなりません。しかし、弱参照の場合は、「できるだけ早く」削除する必要があります。また、JVMのメモリが不足している場合にのみ削除する必要があります。 – pgras

関連する問題