当运行时内存接近溢出时,从缓存中删除数据是可能的吗?缓存实现如下:
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()?
发布于 2019-09-25 03:04:12
老实说,Guava的Cache --或者任何堆上缓存实现--没有好的方法来做您所要求的事情。软引用可能看起来很有效,但更有可能导致糟糕的行为--例如,JVM可能会执行连续的、不间断的完全垃圾收集。
解决这个问题的最好方法是实实在在地进行实验,找到一个适合您的maximumSize参数。您的实现也不会起作用,因为它不会试图衡量某个特定的条目。
发布于 2019-09-25 00:19:30
如果您的目标是避免在整个JVM范围内耗尽内存,那么垃圾收集器就是这项工作的合适人选。我建议您使用soft-values,如下所示:
Cache<String, Cache<String, List<String>>> cache = CacheBuilder.newBuilder()
.softValues()
.build();这将设置一个缓存,该缓存包装它存储在SoftReference中的任何值。软引用对象将以全局最近最少使用的方式进行垃圾收集,以响应内存需求和缓存中无效的条目。
https://stackoverflow.com/questions/58070489
复制相似问题