6

グアバのドキュメントによるとMapMaker.softValues()

警告: ほとんどの場合、ソフト参照を使用する代わりに、キャッシュごとの最大サイズを設定する方が適切です。この方法は、ソフト参照の実際の結果に精通している場合にのみ使用してください。

ソフト参照の動作、使用、およびガベージ コレクションとのコントラクトについては、中程度の理解があります。しかし、これらの実際的な結果は、ドキュメントが暗示しているものなのだろうかと思っています。ソフト参照ではなく最大サイズを使用する方が正確なのはなぜですか? キャッシュの実装に関して、ソフト参照のアルゴリズムと動作により、ハードコードされた上限よりも効率的に使用できるようになりませんか?

4

2 に答える 2

4

SoftReferencesを使用する際の実際的な問題の1つは、SoftReferencesが一度に破棄される傾向があることです。キャッシュを使用する理由は、ほとんどの場合、かなり優れたパフォーマンスを提供するためです。

ただし、キャッシュにSoftReferencesを使用すると、アプリケーションがGCで停止した後、キャッシュが再構築されるまで実行速度が遅くなる可能性があります。つまり、アプリケーションが追いつく必要があるときだけです。

注:LinkedHashMapをLRUキャッシュとして使用できます。複雑である必要はありません。

于 2011-07-06T06:44:25.937 に答える
4

彼らがほのめかしているのは、メモリを解放する必要があるときに参照がgcされるだけなので、ソフト参照マップを使用する場合、最大のメモリ使用量と潜在的により多くのgcアクティビティに備える必要があるということだけだと思います。

キャッシュ内の最後の n 個の値のみが必要であることがわかっている場合は、LRU キャッシュを使用する方が無駄のないアプローチであり、実行中のアプリケーションのリソース使用量がより予測可能になります。

さらに、これによると -server と -client JVM の動作には微妙な違いがあるようです。

Sun JRE は、SoftReferences を WeakReferences とは異なる方法で扱います。使用可能なメモリに圧力がかかっていない場合は、SoftReference によって参照されるオブジェクトを保持しようとします。1 つの詳細: 「-client」JRE と「-server」JRE のポリシーは異なります。-client JRE は、ヒープを拡張するよりも SoftReferences をクリアすることを優先することで、フットプリントを小さく保とうとしますが、-server JRE は、 SoftReferences をクリアするよりもヒープを拡張する (可能であれば) ことを優先することで、パフォーマンスが向上します。1 つのサイズがすべてに適合するわけではありません。

于 2011-07-06T06:29:09.287 に答える