当前位置: 首页 > 面试题库 >

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

公西嘉玉
2023-03-14
问题内容

我正在尝试配置Ehcache(2.5版),使其永远不会忘记项目。我正在以编程方式进行配置,但没有涉及任何配置XML文件。通过设置eternaltrue我的理解是,只有在我磁盘空间不足或超过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
MB的堆。磁盘上的溢出告诉Ehcache,当堆填充到阈值时元素会溢出到磁盘上。现在,为此缓存设置的密钥仍将保留在堆上。而且,由于Ehcache仍在尝试保护您免受OOME的侵害,因此一旦密钥集无法再保存在内存中时,它将需要从磁盘上逐出。

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

如果您确实有一个用例,需要在磁盘上投入大量资源并最大程度地减少堆上存储,则可能需要查看http://ehcache.org/documentation/user-
guide/storage-options#enterprise-
diskstore



 类似资料:
  • 我的要求是有基于磁盘的缓存。如果缓存内存已满,我希望将LRU元素推送到磁盘。然后,如果磁盘上的文件已满,我希望驱逐磁盘上的LRU元素。这是一个非常简单的要求,但是我无法使用EhCache来实现。 我使用EhCache(2.10.1)进行以下配置: 我的期望是,当缓存被填满时(即缓存大小超过50M),我希望将LRU元素推送到文件中,从而为内存中的新元素创建一些空间。 然而,这不是EhCache的工作

  • 我是Selenium IDE的新手,目前还没有通过第一个基础,测试中的应用程序在弹出窗口中打开一个登录窗口,输入用户名和密码,然后单击登录按钮,此时窗口关闭,应用程序显示在主浏览器窗口中,脚本显示为记录OK,但是在回放时,它失败了,出现了一个元素未找到错误,如果我使用目标查找按钮,字段被找到(突出显示的黄色),如果我执行命令,它将值写入字段,所以Selenium似乎知道它在那里。 我尝试了targ

  • 问题内容: 我刚遇到一个很奇怪的东西。 为什么它会抬高而又改变内部? 问题答案: 正如我在评论中开始提到的那样,实际上是 在原地 修改列表,然后尝试将结果分配给元组中的第一个位置。从数据模型文档中: 调用这些方法以实现增强的算术分配(+ =,-=, =,/ =,// =,%=,* =,<< =,>> =,&=,^ =,| =)。这些方法应尝试就地进行操作(修改self)并返回结果(可以是,但不一定

  • 我构建了一个深度学习模型,与VGG网略有相似。我正在使用带有Tensorflow后端的Keras。模型摘要如下: 我尝试了优化器(SGD,Adam等),损失(MSE,MAE等),批大小(32和64)的不同组合。我甚至尝试过从0.001到10000的学习率。但是,即使在 20 个 epoch 之后,无论我使用哪种损失函数,验证损失仍然完全相同。训练损失变化不大。我做错了什么? 我的网络应该训练做什么

  • 问题内容: 如何设置会话超时,使其永不过期?它用于Java EE Web应用程序。 问题答案: 指定一个负时间。 然而,好处令人怀疑。Webapp将长期泄漏内存。在执行此操作之前,请三思。

  • 我正在测试一个关闭窗口的按钮。然后当我单击按钮时,我需要检查窗口是否关闭。 我创建了这个方法: 但是它不起作用。硒在加载最后一步时停留了很长时间,最终显示了这个错误 命令:[8139ce6f8c35642a752d7fbedb186ec6,findElement{using=xpath,value=By.xpath:By.xpath:By.xpath:By.xpath:By.xpath:By.xp