4

gwt-webapp のサーバー側でグアバのキャッシュを使用しています。しかし、キャッシュを適切に構成するには、いくつかの「テレメトリ」を知る必要があります。最初に、1 つのキャッシュ エントリがどれだけのメモリを必要とするかを知る必要があります。これまでのところ、jconsole と visualvm を試しました。問題は、どこを見ればいいのかわからないことです。ConcurrencyHashMap とそのエントリを探しましたが、正しいインスタンス数が見つかりません。

では、(グアバ) キャッシュをプロファイリングするための適切でおそらく簡単な方法は何ですか?

(現時点では、キャッシュのサイズの概算/平均(エントリ)を取得するためのツールにお金を払う準備ができていません)

議論の状況の要約: Aaron Digulla は、弱い参照を使用し、Java にメモリ管理の仕事を任せることを提案しています。しかし、以前の質問では、弱い参照を使用する際のパフォーマンスの問題のために、人々はキャッシュを「調整、監視、調整」することを提案しています。

更新 OK 私の質問はおそらく誤解を招くものでした-キャッシュやそのオーバーヘッドについて知りたくありません。特定のオブジェクトのインスタンスの大きさを知りたい - キャッシュを構成する (この場合はグアバ)。私が答えなければならない最初の質問は、メモリ内のすべてのインスタンスを取得できるか (ヒット率 100%)、またはこれに必要なメモリ量はどれくらいかということです。これが可能な場合、キャッシュ構成は必要ありません。すべてのオブジェクトがあまりにも多くのメモリを消費する場合、構成について考える必要があります。オブジェクトの平均メモリ フットプリントについて何か言えるツールがあることを願っています。

4

3 に答える 3

7

正しい解決策は、メソッドを呼び出すことstats()です。特にメモリの価格を見ると、キャッシュが使用するメモリの量はほとんど関係ありません。ROI の観点から: キャッシュのメモリ最適化に数時間以上を費やした場合、別の 4 GB の RAM をインストールした方が安上がりでした。

また、「エントリのサイズ」を判断するのは簡単ではありません。キャッシュに入れる値によって、1 つのエントリのサイズが異なる場合があります。( inLocalCache.LocalLoadingCacheを使用する場合) またはheap dumpのインスタンスの検索を試みることができます。CacheLoaderbuild()LocalCache.LocalManualCache

これでインスタンスのサイズの平均が得られるはずですが、あまり役に立ちません。サイズは「再帰的」ではないため、参照は考慮されていません。参照を含める際の問題は、どこで停止するかです。

たとえば、各クラスにはクラスローダーへの参照があります。多くのクラスローダーは、ロードしたすべてのクラスへの参照を保持します。それが含まれている場合、インスタンスのサイズはかなり大きくなります。

YourKitはこの種の分析に非常に優れていますが、上で述べたように、通常は価値がありません。

于 2012-04-16T07:57:28.790 に答える
2

これは実際には外部ツールではありませんが、memory-measurer のようなものを使用して、エントリのサイズを記録できます。何かのようなもの:

Cache cache = ...
// copy the entries to avoid measuring the footprint of the "EntrySet view"
List<Map.Entry<K, V>> entries = ImmutableList.copyOf(cache.asMap().entrySet());
long memory = MemoryMeasurer.measureBytes(entries);
logger.trace("Size of %s entries : %s bytes", entries.size(), memory);

これを数分ごとに記録し、データを分析できます。

Guava キャッシュのチューニングを簡素化するためのより優れたプロファイリング ツールを提供することについての議論があったと思います。「自己調整」キャッシュのアイデアも持ち出されました。ただし、それを読んだディスカッションスレッドが見つからないようです。

于 2012-04-16T11:33:05.990 に答える
2

JProfilerを使用したソリューションについては、この質問を参照してください。

JProfiler 8 には、専用の Guava プローブがあります。免責事項: 私の会社は JProfiler を開発しています。

于 2012-04-16T08:46:45.853 に答える