Java Ehcache设置为“永恒”,但仍会忘记元素?

Java Ehcache设置为“永恒”,但仍会忘记元素?,java,caching,ehcache,Java,Caching,Ehcache,我正在尝试配置Ehcache(版本2.5),以便它永远不会忘记项目。我正在以编程方式进行配置,但没有涉及任何配置XML文件。通过将external设置为true,我的理解是,只有在磁盘空间不足或超过maxBytesLocalDisk(或应用程序终止)的情况下,才能从缓存中删除项。但是,该测试程序未显示以下行为: public static void main(String[] args) { CacheManager cacheManager = CacheManager.create();

我正在尝试配置Ehcache(版本2.5),以便它永远不会忘记项目。我正在以编程方式进行配置,但没有涉及任何配置XML文件。通过将
external
设置为
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());      
}
publicstaticvoidmain(字符串[]args){
CacheManager CacheManager=CacheManager.create();
缓存=新缓存(
新建CacheConfiguration().name(“测试”)
.overflowToDisk(真)
.永恒(真实)
.maxBytesLocalHeap(1,MemoryUnit.MB)
.overflowToOffHeap(false)
.maxBytesLocalDisk(100,MemoryUnit.GIGABYTES)
.maxElementsOnDisk(0)
.TimeToIdles(0)
.timeToLiveSeconds(0)
.diskStorePath(“E:\\Data\\Ehcache”);
cacheManager.addCache(cache);
对于(int i=0;i<1000000;i++){
put(新元素(“键”+i,“值”+i));
}
System.out.println(cache.getSize());
}

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

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

我稍微改变了你的配置,使用10MB,我可以在缓存中获得32K个条目。如果我将密钥更改为更小(仅整数实例),我可以在缓存中获得46K个条目。但基本上,您使用的这种配置是有限制的,因为在堆上设置密钥的情况下,Ehcache将永远无法在磁盘上保存这么多。希望这能澄清一点


如果您确实有一个需要在磁盘上放置大量数据并最小化堆存储的用例,那么您可能需要研究一下

我实际上并不打算只使用1MB堆;我这样设置只是为了确保达到需要溢出到磁盘的程度。我打算使用几GB的堆,但我想确保我已经将其配置为绝对不会忘记元素。我想这回答了所问的问题,因此请询问是否有任何方法确保元素不会从diskstore(免费版本)中被逐出。