如何释放番石榴缓存对象

时间:2019-03-15 08:24:12

标签: java caching guava

在我的应用程序中,我通过CacheBuilder.newBuilder()方法构建了一个Guava Cache对象,现在我需要为其动态调整一些初始化参数。

由于我找不到用于番石榴缓存的任何重建方法,因此我必须重建一个新方法。

我的问题是:

  1. 有人教我how to release the old one吗?我也没有找到任何有用的方法,我只是为旧的调用cache.invalidateAll()使所有密钥失效。 Is there any risk for OOM吗?

  2. 由于缓存可能在多线程中使用,是否有必要将缓存声明为volatile

我的代码如下:

private volatile LoadingCache<Long, String> cache = null;
private volatile LoadingCache<Long, String> oldCache = null;

public void rebuildCache(int cacheSize, int expireSeconds) {
    logger.info("rebuildCache start: cacheSize: {}, expireSeconds: {}", cacheSize, expireSeconds);
    oldCache = cache;
    cache = CacheBuilder.newBuilder()
        .maximumSize(cacheSize)
        .recordStats()
        .expireAfterWrite(expireSeconds, TimeUnit.SECONDS)
        .build(
            new CacheLoader<Long, String>() {
                @Override
                public String load(Long id) {
                    // some codes here
                }
            }
        );
    if (oldCache != null) {
        oldCache.invalidateAll();
    }
    logger.info("rebuildCache end");
}

public String getByCache(Long id) throws ExecutionException {
    return cache.get(id);
}

1 个答案:

答案 0 :(得分:0)

您无需执行任何特殊操作即可释放旧版本;它将像其他任何对象一样收集垃圾。您可能应该将缓存标记为易失性甚至更好的AtomicReference标记,以便多个线程不会同时替换缓存。也就是说,oldCache应该是方法内部的变量,而不是类。