主要问题是 ehcahce 2.6.2根据ehcache配置执行过期元素的任何驱逐;还是我必须以编程方式逐出?
在阅读文档的各个部分(data life和cache 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似乎抓住了对象并填满了!
阅读文档似乎我应该使用MessageReaper,但即使在配置中包含此内容后,我也会看到相同的问题。我应该查看SimpleMessageStore的容量设置吗?
答案 0 :(得分:0)
在您的ehcache配置中,如果您想要指定内存限制,我看不到任何内存限制,您必须在ehcache标记上设置“maxBytesLocalHeap”属性。
Ehcache文档以获取更多信息: http://ehcache.org/documentation/configuration/cache-size#mixed-sizing-configurations
答案 1 :(得分:0)
而不是'maxElementsInMemory',在ehcache缓存配置中使用'maxBytesLocalHeap'来限制堆使用。