gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:07 27 4
gpt4 key购买 nike

我正在尝试配置 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 的影响,一旦 key 集不能再保存在内存中,它就需要从磁盘中逐出。

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

如果您确实有一个用例需要在磁盘上放置大量内容并最小化堆上存储,您可能需要查看 http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

关于java - Ehcache 设置为永恒但无论如何都会忘记元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8959221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com