【问题标题】:Ehcache not evicting cached entriesEhcache 不驱逐缓存的条目
【发布时间】:2013-09-16 00:12:16
【问题描述】:

主要问题是 ehcahce 2.6.2 是否会根据 ehcache 配置驱逐过期元素?还是我必须以编程方式驱逐?

在阅读了文档的各个部分(data lifecache sizing)后,我们将当前配置设置为使用 TTI/TTL 和 CacheManager 级别 maxBytesLocalHeap=1024m。设置后,我希望 ehcache 最多只能使用 1Gb 的堆空间进行缓存,但从测试(和生产)来看,我们始终看到 JVM 堆已满(在我们的例子中为 2GB)

Ehcache 似乎不支持我们设置的 maxBytesLcoalHeap 设置。当然,除非我(很可能)不明白这个设置实际上在做什么。

来自我们管理员的一些注释:

在此测试期间,maxBytesLocalHeap 值为 1024m,这应该具有有限的缓存条目,并且对整个缓存管理池的总引用为 1GB。 8 个单独的缓存被配置为使用 1024m 的一部分。堆利用率稳步攀升至最大堆大小 2GB。一旦到达那里,垃圾收集就会花费更长的时间并且响应时间会降低。测试结束后最大堆大小没有减少。事实上,在测试结束后大约 30 小时,我通过 CacheManagement 页面清除了所有缓存条目,并让 JVM 整夜安顿下来,堆仍然承诺为 2GB。老一代空间的使用是平的,没有多余的空间。在我清除缓存条目后,年轻代空间的使用量下降了一些,但只有大约 240MB,并且提交的空间并没有减少。

感谢您的帮助和指导!

更新

ehcahce 配置

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>

 <cache name="storeCache" 
   maxElementsInMemory="2500"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="86400"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="courseCache" 
   maxElementsInMemory="100000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="43200"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="mtcIdCache" 
   maxElementsInMemory="500000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="3600"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="catentryCache" 
   maxElementsInMemory="500000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="3600"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="priceCache" 
   maxElementsInMemory="500000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="300"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="inventoryCache" 
   maxElementsInMemory="500000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="300"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="attributeCache" 
   maxElementsInMemory="500000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="300"
   statistics="true"> 
   <persistence strategy="none" />
</cache>

<cache name="partnerCache" 
   maxElementsInMemory="10000"
   memoryStoreEvictionPolicy="LFU"
   eternal="false"
   timeToLiveSeconds="86400"
   statistics="true"> 
   <persistence strategy="none" />
</cache>
</ehcache>

**第二次更新**

这是我们的管理员对堆利用率的评价

我为 websvc01 JVM 拍摄了两个与此耐久性测试相关的内存快照。它们在 dynaTrace 中可用,时间为星期一 09/09 @ 10:10:59 和星期二 09/10 @ 10:46:48。两个快照都是深度内存泄漏分析快照,捕获了字符串对象的值。

在此测试期间,maxBytesLocalHeap 值为 1024m,这应该具有有限的缓存条目,并且对整个缓存管理池的总引用为 1GB。 8 个单独的缓存被配置为使用 1024m 的一部分。堆利用率稳步攀升至最大堆大小 2GB。一旦到达那里,垃圾收集就会花费更长的时间并且响应时间会降低。测试结束后最大堆大小没有减少。事实上,在测试结束后大约 30 小时,我通过 CacheManagement 页面清除了所有缓存条目,并让 JVM 整夜安顿下来,堆仍然承诺为 2GB。老一代空间的使用是平的,没有多余的空间。在我清除缓存条目后,年轻代空间的使用量下降了一些,但只有大约 240MB,并且提交的空间并没有减少。

更新:

感谢您的回复,我非常感谢。很抱歉有一段时间没有更新这个问题。

使用 DynaTrace,我们能够确定这是 Spring Integration 的问题。具体来说,SimpleMessageStore 似乎正在持有对象并填满!

阅读文档似乎我应该使用MessageReaper,但即使在配置中包含此内容后,我也看到了同样的问题。我应该查看 SimpleMessageStore 的容量设置吗?

【问题讨论】:

  • 能否给你提供ehcache.xml配置?
  • 你确定内存被 ehcache 消耗了吗?如果不进行堆转储并使用 eclipse 内存分析器进行探索
  • 我用缓存配置更新了问题。事实证明,并不是所有的内存都被 ehcahce 消耗掉了。缓存没有按预期清除,不知道为什么。我们有很多 java.util.concurrent.locks.ReentrantLock$NonfairSync、java.util.concurrent.ConcurrentHashMap$HashEntry、Java.util.concurrent.locks.ReentrantLock 和 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject。在记忆中。 [stackoverflow.com/questions/3959122/…。基本上,是为了缩短 web.xml 中的 tomcat session-timeout。想法?
  • 对不起,我把上面的链接和解释搞砸了。我想说我能找到的关于这些物体过度堆积的唯一其他解释是here
  • 在你的堆转储中,你能看到每个缓存实例的大小吗?如何从缓存中删除缓存元素?如果我相信您的管理员所说,您的缓存仅占用 240MB 内存。所以有两种可能性:1/ 你的缓存只占用 240MB 并且你有内存泄漏,2/ 来自缓存元素的引用保存在你的应用程序中,即使你清理缓存,这些元素也不是 GC,你的内存消耗仍然很高。

标签: java spring caching ehcache


【解决方案1】:

在您的 ehcache 配置中,如果您想指定内存限制,我看不到任何内存限制,您必须在 ehcache 标记上设置“maxBytesLocalHeap”属性。

Ehcache 文档了解更多信息: http://ehcache.org/documentation/configuration/cache-size#mixed-sizing-configurations.

【讨论】:

  • 明白。我们确实尝试使用该属性。恰好上面的 ehache 副本来自我的本地。我们已经使用您提到的属性进行了测试。即使使用该属性,堆似乎仍在构建。
【解决方案2】:

不要使用“maxElementsInMemory”,而是在 ehcache 缓存配置中使用“maxBytesLocalHeap”来限制堆使用量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多