首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用可用内存作为参数通过Guava cache缓存数据?

如何使用可用内存作为参数通过Guava cache缓存数据?
EN

Stack Overflow用户
提问于 2019-09-24 05:34:37
回答 2查看 172关注 0票数 0

当运行时内存接近溢出时,从缓存中删除数据是可能的吗?缓存实现如下:

代码语言:javascript
复制
Cache<String, Cache<String, List<String>>> cache = CacheBuilder.newBuilder()
            .maximumWeight((int) ((Runtime.getRuntime().totalMemory() / 1024) * 0.9))
            .weigher((Weigher<String, Cache<String, List<String>>>) (key, val) -> runtimeMemory())
            .build();

public static int runtimeMemory() {
        long totalMemory = Runtime.getRuntime().totalMemory() / 1024;
        long freeMemory = Runtime.getRuntime().freeMemory() / 1024;
        return (int) (totalMemory - freeMemory);
    }

是工作还是不工作?或者weigher汇总了每个值的runtimeMemory()?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-25 03:04:12

老实说,Guava的Cache --或者任何堆上缓存实现--没有好的方法来做您所要求的事情。软引用可能看起来很有效,但更有可能导致糟糕的行为--例如,JVM可能会执行连续的、不间断的完全垃圾收集。

解决这个问题的最好方法是实实在在地进行实验,找到一个适合您的maximumSize参数。您的实现也不会起作用,因为它不会试图衡量某个特定的条目。

票数 3
EN

Stack Overflow用户

发布于 2019-09-25 00:19:30

如果您的目标是避免在整个JVM范围内耗尽内存,那么垃圾收集器就是这项工作的合适人选。我建议您使用soft-values,如下所示:

代码语言:javascript
复制
Cache<String, Cache<String, List<String>>> cache = CacheBuilder.newBuilder()
        .softValues()
        .build();

这将设置一个缓存,该缓存包装它存储在SoftReference中的任何值。软引用对象将以全局最近最少使用的方式进行垃圾收集,以响应内存需求和缓存中无效的条目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58070489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档