首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分析缓存(番石榴)

如何分析缓存(番石榴)
EN

Stack Overflow用户
提问于 2012-04-16 07:34:02
回答 3查看 6K关注 0票数 4

我正在使用我的gwt-webapp服务器端的番石榴缓存。但是为了正确配置缓存,我需要知道一些“遥测”。首先,我需要知道一个缓存条目占用多少内存。到目前为止,我尝试了jconsole和visualvm。问题是,我不知道该去哪看。我查找了ConcurrencyHashMap及其条目,但找不到正确的实例数。

那么,什么是分析(番石榴)缓存的好方法,可能也是简单的方法?

(目前,我还没有准备好为一个工具支付费用,以获得一个近似/平均的cach (条目)大小)。

讨论状态总结:and建议使用弱引用,并让完成内存管理工作。但是在前一个问题中,由于使用弱引用的性能问题,人们建议“调优、监视、调优”缓存。

更新 ok我的问题可能是错误的-我不想知道一些关于缓存或其开销的信息。我想知道给定对象的实例有多大--配置缓存(在本例中是番石榴)。我必须回答的第一个问题是:我是否可以获得内存中的所有实例(100%命中率),或者这将占用多少内存。如果这是可能的,则不需要缓存配置。如果所有对象都占用太多内存,我必须考虑配置。我希望有一个工具可以说明对象的平均内存占用情况。

EN

回答 3

Stack Overflow用户

发布于 2012-04-16 07:57:28

正确的解决方案是调用stats()方法。缓存使用的内存数量几乎与此无关,特别是当您查看内存价格时。从ROI的角度来看:如果您花费超过几个小时试图优化您的缓存,那么再安装4GB的RAM就更便宜了。

此外,要确定“条目的大小”也不容易。根据放入缓存的值,单个条目的大小可能有所不同。您可以尝试查找LocalCache.LocalLoadingCache的实例(如果在build()中使用CacheLoader )或在堆转储中查找LocalCache.LocalManualCache的实例。

这应该会给出实例大小的平均值,但不会有太大帮助:这个大小不是“递归”的,因此它不考虑引用。包含引用的问题是在哪里停止。

例如,每个类都有一个对类加载器的引用。许多类加载器保留对它们加载的所有类的引用。如果这包括在内,那么您的实例的大小将是远远不够的。

YourKit非常擅长这种分析,但正如我前面所说的,它通常是不值得的。

票数 7
EN

Stack Overflow用户

发布于 2012-04-16 08:46:45

有关使用这个问题的解决方案,请参阅JProfiler

JProfiler 8将有一个专用的番石榴探测器。免责声明:我的公司开发JProfiler。

票数 2
EN

Stack Overflow用户

发布于 2012-04-16 11:33:05

它并不是一个真正的外部工具,但是您可以使用像记忆测量器这样的工具来记录条目的大小。类似于:

代码语言:javascript
复制
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);

您可以每隔几分钟记录一次,然后分析数据。

我认为有人讨论过提供更好的分析工具来简化番石榴缓存调优。“自校正”缓存的概念也被提出了。不过,似乎找不到我读过的讨论主题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10170232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档