2016-09-15 14 views
2

私は実行に数時間かかる計算的に集中的なオフショー処理タスクがあり、私はメモリ内キャッシュとしてCaffeineを使用しています。最大キャッシュサイズを設定するためのヒューリスティックはなんですか? Javaプログラムを8GBのRAMで実行していますが、キャッシュを4GBほど提供したいと思いますが、キャッシュの実際のサイズにメモリがどのように変換されるかはわかりません。私が決めるJVMをできるように.softValues()で行くことにしましたが、私はカフェインのJavaDocの次の単語に走った:カフェイン:適切なキャッシュサイズを得るには

警告:ほとんどの状況では、ソフト使用するのではなく、あたりのキャッシュの最大サイズを設定することをお勧めします参照。この方法は、ソフトリファレンスの実際の結果に精通している場合にのみ使用してください。

答えて

2

ソフトリファレンスは概念的には魅力的ですが、通常は長期実行のJVMでパフォーマンスが低下します。これは、古い世代を埋めることによってヒープ・プレッシャーを作り出し、完全なGC中にはcollectedしかないためです。これは、十分なメモリが開放され、すぐに消費され、もう1つの完全なGCが必要となるGCスラッシングを引き起こす可能性があります。レイテンシに敏感なアプリケーションでは、どのキャッシュが最も重要であるかを暗示する方法がないため、追い出しがグローバルなので、これはさらに影響を受けます。

ソフトリファレンスはデフォルトではありません。戦略に進みます。それはスループットではなく、ユーザが直面していないタスクでは妥当な単純化であるかもしれない。しかし、GCの時間、待ち時間、予測可能なパフォーマンスが重要な場合は、危険です。

サイジングのための最良の答えは、推測し、測定し、繰り返すことです。統計をエクスポートし、設定を試し、適切に調整します。ヒット率曲線は、アクセストレース(キーハッシュのログ)と異なるサイズのsimulatingをキャプチャすることで取得できます。その興味深いデータですが、通常はチューニングのための簡単な実行が十分です。

1

ソフトリファレンスでは、メモリが不足している場合にVMがオブジェクトを再要求できます。これは、キャッシュとは異なる戦略です。あなたは、単に持っている可能性がありWeakHashMapSoftReferenceWeakReferenceの違いはしかし、そこにある)

一つの大きな違いは、キャッシュは、通常、ソフト/弱参照が勝っている間、あなたがオブジェクトを立ち退かための戦略(LRU、FIFOなど)を決定しましょうということです't。

オブジェクトのサイズを少なくとも大きさで推測できるはずです。 1k、1MB、10MBですか?

オブジェクトの大きさが本当にわからない場合、ほとんどのキャッシュでは、リスナーを追い出しに追加してログに記録できます。ルックアップのキャッシュミスのログと組み合わせると、キャッシュの実行方法がわかります。

関連する問題