2012-02-10 15 views
3

キャッシュAPIを検索すると、Guavaが見つかりました。 しかし、wikiJavadocを読んで1つの質問が発生しました.CacheBuilderが取ることができる設定のデフォルト値は何ですか? Javadocには、「これらの機能はすべてオプションです」と「強力なキー、強力な値、あらゆる種類の自動追い出しを含まないデフォルト設定で新しいCacheBuilderインスタンスを構築します」と記載されています。私の意見でGoogleの共通キャッシュ - maximumSizeのデフォルト値(およびその他の「オプション」設定) - すべての「使用可能な」メモリを使用するキャッシュが必要です

maximumSizeのための適切なデフォルトが終わりRuntime.getRuntime().freeMemory();

に対するだろう、私は与えられたシステム上で使用可能なメモリを使用するキャッシュをしたいです。だから、どれくらいfreeMemory()が利用可能かを尋ねる追い出し戦略が必要です(おそらくRuntime.getRuntime().maxMemory()との相対的なもの)

+0

"利用可能なメモリを使用するキャッシュが必要です..."あなたはこれが明確に定義されていないことを認識しなければなりません。 2つのキャッシュエントリは、それぞれ1Kのメモリを占有するオブジェクトを参照する可能性があります。しかし、一方では、参照されたオブジェクトはキャッシュ外の他のものによって参照され、他方は参照されません。それで? –

+0

softValues()が使用されている場合、vmがその処理を決定します。私がキャッシュ内のもの(おそらく各エントリ)に多くの参照をするなら、私はヒープ空間のエラーのうちに泣くことはありません。ですから、softValuesとキャッシュされたオブジェクトの注意深い扱いで、これはうまくいくでしょうか? – dermoritz

答えて

1

私は同じことに疑問を持ちましたが、ウェブ上で何も見つけられませんでした。だから私はこれを非常に原始的なテストにしました。 私は、最も基本的なセットアップ(最大サイズ、退去ポリシー、何もない)でLocalCacheを作成するコードを書いて、無限ループではキャッシュにものを入れます。また、ヒープの使用状況を確認するためにVisualVmで監視しました。

import com.google.common.cache.Cache; 
import com.google.common.cache.CacheBuilder; 

import java.util.concurrent.TimeUnit; 

public class CacheTest { 
    public static void main(String[] args) { 
     Cache<String, String> cache = CacheBuilder.newBuilder().build(); 
     int counter = 0; 
     while(true){ 
      cache.put("key"+counter++,"value"); 
      System.out.println("size:"+cache.size()); 
     } 
    } 
} 

下の画像からわかるように、メモリ使用量は最大利用可能な領域に拡大して一定になります。私は数分待ちましたが、OutOfMemoryErrorは発生しませんでした。何が起こったのかは、数秒後に新しいエントリが1つ追加されるため、将来的にはエラーが発生する可能性があります。

Heap Dump

結論:あなたはMAXIMUMSIZE値を設定する必要はありませんが、私はあなたがキャッシュをクリーンアップし、OutOfMemoryErrorが発生を避けるために立ち退きポリシー(expireAfterAccessまたはexpireAfterWrite)のいくつかの種類を使用することをお勧め。また、キャッシュのパフォーマンスを低下させることもありません。

6

実際には、空きメモリはキャッシュ追い出しのためのメトリックではありません。理由は、ガベージコレクションのためです。空きメモリが不足していると、ガベージコレクタが実行されるタイミングになっている可能性があります。その後、空きメモリが大量になります。だからあなたはあなたは蓄積されたゴミをたくさん持っているので、キャッシュからものを落としたくない。

1つの選択肢はsoftValues()ですが、ソフトリファレンスが実際に本番のパフォーマンスを低下させる可能性があるため、これを強くお勧めします。

正しいことは、本質的にキャッシュが消費するメモリの総量を制限するmaximumSizeを慎重に選択することです。エントリが可変量の領域を占める場合は、代わりにmaximumWeightを使用してモデル化することができます。

+0

thxであるため、使用可能なメモリを持つキャッシュ "環境認識" /スケールを取得する唯一の方法は、softValues()を使用することですが、これはお勧めできません。私の場合、すべてのオブジェクトはほぼ同じ量のメモリを使用しますが、どれくらいの量があるのか​​分かりません。 ああ、私の "他の"質問はどうですか?maximumSizeのデフォルトは何ですか? – dermoritz

+0

@dermoritz - また、キャッシュ構造自体のコストを考慮する必要があるかもしれません - Dimitris Andreouは、最近この記事を投稿しました。http://code-o-matic.blogspot.com/2012/02/updated- memory-cost-per-javaguava.html –

+1

つまり、優れたキャッシュパフォーマンスを得るための古典的な「調整、監視、調整」サイクルを強調します。それ以外のものは私たちが持っていない魔法を取るでしょう。 –

関連する問題