Ehcache没有驱逐缓存的条目

时间:2013-09-11 20:01:18

标签: java spring caching ehcache

主要问题是 ehcahce 2.6.2根据ehcache配置执行过期元素的任何驱逐;还是我必须以编程方式逐出?

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

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

我们的管理员提供的一些说明:

  

在此测试期间,maxBytesLocalHeap值为1024m,应该具有有限的缓存条目,并且对整个缓存管理池的引用总计为1GB。 8个单独的缓存配置为使用1024米的一部分。堆利用率稳步攀升至最大堆大小2GB。在那里,垃圾收集花费更长时间并且响应时间降低。测试结束后,最大堆大小没有减少。实际上,在测试结束后大约30个小时,我通过CacheManagement页面清除了所有缓存条目,并允许JVM过夜,并且堆仍然提交到2GB。老一代空间的使用是平坦的,没有余地。在我清除缓存条目后,Young Generation空间的使用有所下降,但这只有大约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拍摄了两张与此耐久性测试相关的内存快照。它们可以在星期一09/09 @ 10:10:59和星期二09/10 @ 10:46:48的dynaTrace中找到。这两个快照都是深度内存泄漏分析快照,捕获了字符串对象的值。

     

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

更新

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

使用DynaTrace我们能够确定它是Spring Integration的一个问题。具体来说,SimpleMessageStore似乎抓住了对象并填满了!

dynaTrace snapshot

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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