いくつかのテストを行うために、SoftReferenceのオブジェクトのキャッシュに保存されているオブジェクトの一部またはすべてが破棄されたときに、アプリケーションの動作を確認したいと思います。Javaのオブジェクトが柔らかく到達可能かどうかを判断する方法はありますか?
これを実行するには、キャッシュされたSoftReferenceオブジェクトに格納されている参照を手動でクリアする必要があります(これらのオブジェクトのVMの処理をシミュレートします)。別のプロセスがキャッシュから参照されたオブジェクトを最近取り込んだ場合)。
私のアプリケーションはシングルスレッドなので、このコードが実行されているときにキャッシュされたオブジェクトのソフト到達可能性について心配する必要はありません。これは、現在私がロック機構を持っていないことを意味しています - もし私が持っていたなら、オブジェクトが「使用されている」かどうかを判断するためにこれらを使用した可能性があります。そのようなロックの。
私が試みた1つのアプローチは、ReferenceQueueで登録されたキャッシュに格納されたすべてのオブジェクトに追加のSoftReferenceを作成することです。私が望むことは、キャッシュ内の柔らかく到達可能なすべてのオブジェクトが、追加のSoftReferenceをキューに追加することでした。したがって、キューをループしてキャッシュからオブジェクトを削除するだけでした。しかし、GCは余裕をもって到達可能なオブジェクトをそれぞれのキューにエンキューするように見えるので、キャッシュ内のオブジェクトの繰り返し処理が完了すると、キューに何かが追加されることは保証されません。
私が見てきたことの1つは、非常に小さな値を持つ-XX:SoftRefLRUPolicyMSPerMB JVMオプションです。賢明なメモリ割り当てでは、これはキャッシュの中の弱く到達可能なオブジェクトを私には届きにくいものにするでしょうが、キャッシュから柔らかく到達可能なオブジェクトをクリアする要求を受け取るまで、アプリケーションを正常に実行したいと思います。 JVMのオプションとして、私は私のアプリが実行されている間、私はこの値を変更することができるとは思わない。
だから、どのように私はオブジェクトが唯一の到達可能な(したがって、クリアすることができます)かどうかを判断することができますか?
編集:
- アプリは、おそらく私は、これらはそっと出てオブジェクトを参照クリアしたいタイミングで有用な作業をやってます:明らかにされていない可能性がありいくつかの余分なポイント。だから私はGCが私のためにオブジェクトをクリアしようとしないようにしたいと思う。
- どのソフトに到達可能なオブジェクトが消去されたのかを選択できるとよいでしょう。
- 正常に動作するように、つまり本番メモリの設定を使用してアプリを使用したいと思います。コード内の設定を変更すると、その値をプロダクション値に戻すことができます。
すべての要件を満たしているわけではありませんが、私は行くつもりです。 – Cyphus