0

我正在使用 guava 库 14.0.1 来实现缓存服务(一个包含用于放置和获取值的 servlet 的 Web 应用程序)。Web 应用程序部署在包含 1GB RAM(谷歌后端)的机器上。写入和读取操作的数量巨大(每秒 50 个查询)。

即使在达到最大大小限制后,机器上使用的 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 使用量超过限制的增加。

4

1 回答 1

4

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

来自 Java 文档

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

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

我说这个速率很低的原因是调用这个集合通常需要一微秒(即你的限制可能是每秒一百万,并发量为 1)

于 2013-05-13T09:29:12.643 回答