番石榴缓存内存泄漏

时间:2013-05-13 08:43:32

标签: java guava

我正在使用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使用量增加。

1 个答案:

答案 0 :(得分:4)

查询率非常低,所以我会尝试减少并发(可能是1-4)并减少最大大小。鉴于您的机器资源有限,我怀疑最大尺寸为1K到100K更合适,具体取决于您的物体的大小。

来自Java文档

  

public CacheBuilder maximumSize(long size)   指定缓存可能包含的最大条目数。

如果您的条目是1 KB,那么仅此缓存就需要大约4 GB。

我说速率相当低的原因是对此集合的调用通常需要一秒钟(即,您的限制可能是每秒一百万的数量级,并发度为1)< / p>