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

我正在尝试配置Ehcache(版本2.5),以便它永远不会忘记项目。 我正在以编程方式配置,我没有触及任何配置XML文件。 通过将eternal设置为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