java – Ehcache设置为永恒但无论如何都会忘记元素?

我正在尝试配置Ehcache(版本2.5),以便它永远不会忘记项目.我正在以编程方式配置,我没有触及任何配置 XML文件.通过将永恒设置为true,我的理解是,如果我的磁盘空间不足或超过maxBytesLocaldisk(或者如果应用程序终止),则可以从缓存中删除项目的唯一情况.但是,此测试程序未显示该行为:
public static void main(String[] args) {
  CacheManager cacheManager = CacheManager.create(); 
  Cache cache = new Cache(
    new CacheConfiguration().name("test")
    .overflowTodisk(true)
    .eternal(true)
    .maxBytesLocalHeap(1,MemoryUnit.MEGABYTES)
    .overflowToOffheap(false)
    .maxBytesLocaldisk(100,MemoryUnit.GIGABYTES)
    .maxElementsOndisk(0)
    .timetoIdleSeconds(0)
    .timetoLiveSeconds(0)
    .diskStorePath("E:\\Data\\Ehcache"));
  cacheManager.addCache(cache);
  for(int i = 0; i < 1000000; i++){
    cache.put(new Element("key_" + i,"value_" + i));
  }
  System.out.println(cache.getSize());      
}

因此,在我的缓存中添加了100万个元素之后,我告诉它溢出到一个数量级足够大的磁盘,最后我只得到了3276个项目.这里发生了什么?

解决方法

使用ARC或基于字节的缓存配置时,Ehcache将尝试保护您的OOME系统.像你一样配置缓存,告诉ehcache你希望这个缓存最多使用1兆字节的堆.当堆填充到阈值时,溢出到磁盘会告诉Ehcache将元素溢出到磁盘.现在,此缓存的密钥集仍将保留在堆上.并且,由于Ehcache仍然试图保护您免受OOME的攻击,因此只要密钥集不能再保存在内存中,就需要从磁盘中逐出.

我稍微改变了你的配置使用10MB,我可以在Cache中获得32K条目.如果我将密钥更改为更小(只有Integer实例),我可以在Cache中获得46K条目.但基本上,这种配置你的使用是限制性的,因为Ehcache永远不能在磁盘上保持那么多,密钥设置在堆上.希望这有点澄清.

如果你真的有一个用例,你需要在磁盘上放很多并最小化堆上存储,你可能想看看http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量