加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – google common cache – maximumSize的默认值(和其他“

发布时间:2020-12-15 08:47:28 所属栏目:Java 来源:网络整理
导读:我刚刚通过搜索缓存API找到了 Guava(它非常适合我的需求). 但是在阅读 wiki和 Javadoc时出现了一个问题 – CacheBuilder可以采用什么设置的默认值? Javadoc声明“这些功能都是可选的”和“使用默认设置构造一个新的CacheBuilder实例,包括强键,强值,并且不会
我刚刚通过搜索缓存API找到了 Guava(它非常适合我的需求).
但是在阅读 wiki和 Javadoc时出现了一个问题 – CacheBuilder可以采用什么设置的默认值? Javadoc声明“这些功能都是可选的”和“使用默认设置构造一个新的CacheBuilder实例,包括强键,强值,并且不会自动驱逐任何类型.”

在我看来,maximumSize的一个很好的默认值是相对于Runtime.getRuntime().freeMemory();

最后,我想要一个使用给定系统上可用内存的缓存.所以我需要一个驱逐策略来询问freeMemory()有多少可用(可能与Runtime.getRuntime()有关.maxMemory())

解决方法

我让我质疑同样的事情,在网上找不到任何东西.所以我做了这个非常原始的测试.
我编写了一段代码,创建了一个具有最基本设置的LocalCache(没有最大大小,没有驱逐策略,没有),并且在无限循环中将内容放入缓存中.并通过VisualVm监视它以检查堆使用情况.

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.concurrent.TimeUnit;

public class CacheTest {
    public static void main(String[] args) {
        Cache<String,String> cache = CacheBuilder.newBuilder().build();
        int counter = 0;
        while(true){
            cache.put("key"+counter++,"value");
            System.out.println("size:"+cache.size());
        }
    }
}

从下图中可以看出,内存使用量增长到最大可用空间并变为常量.我等了几分钟,没有出现OutOfMemoryError.发生的事情是,几秒钟后,一个新条目被添加到地图中,因此将来可能会出现错误.

Heap Dump

结论:您不必设置maximumSize值,但我建议您使用某种逐出策略(expireAfterAccess或expireAfterWrite)来清理缓存并避免出现OutOfMemoryError.并且还要避免降低缓存的性能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读