我正在使用guava库14.0.1来实现缓存服务(一个包含用于放置和获取值的servlet的Web应用程序)。 Web应用程序部署在包含1GB RAM(谷歌后端)的计算机上。写入和读取操作的数量很大(每秒50次查询)。
即使达到maximumSize限制,机器上使用的RAM量也会不断增加。我怀疑内存泄漏。
以下是我用来创建缓存的代码
Cache cache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.DAYS)
.initialCapacity(2000000)
.maximumSize(3800000)
.concurrencyLevel(50)
.recordStats()
.build();
使用
检索值Map result = cache.getAllPresent(keys);
使用
将值放入缓存中cache.put(key, value);
是否有任何设置可用于阻止超出限制的RAM使用量增加。
答案 0 :(得分:4)
查询率非常低,所以我会尝试减少并发(可能是1-4)并减少最大大小。鉴于您的机器资源有限,我怀疑最大尺寸为1K到100K更合适,具体取决于您的物体的大小。
来自Java文档
public CacheBuilder maximumSize(long size) 指定缓存可能包含的最大条目数。
如果您的条目是1 KB,那么仅此缓存就需要大约4 GB。
我说速率相当低的原因是对此集合的调用通常需要一秒钟(即,您的限制可能是每秒一百万的数量级,并发度为1)< / p>