ehcache不会在逐出时从内存中删除Element

问题描述 投票:9回答:2
  1. ehcache 2.5
  2. timeToIdleSeconds =“ 1800”(30分钟),所以我希望元素在闲置30分钟后会退出
  3. 上次使用元素后30分钟,我仍然可以看到缓存中已充满元素
  4. 强制GC并进行堆转储显示,该元素仍在内存中
  5. getSize()返回正数,getKeys()返回预期的键(getKeys()不检查元素是否过期)
  6. 尽管获得特定元素,但结果为NULL,表示该元素已过期。
  7. getKeysWithExpiryCheck()显示,该缓存为空,并且所有元素均已过期并逐出
  8. 强制执行GC并进行堆转储显示,表明元素已从内存中收集。

    maxEntriesLocalHeap="10000"
    eternal="false"
    statistics="true"
    overflowToDisk="false"
    timeToIdleSeconds="1800"
    memoryStoreEvictionPolicy="LFU"
    transactionalMode="off"
    

[从上面,我看到ehcache令人印象深刻,元素已过期,这可能会导致我的代码逻辑刷新它们,但在内部内存下直到元素被污染为止,直到我调用特定元素或getKeysWithExpiryCheck()为止,这不允许我使用ehcache作为有效的内存管理器

如何在timeToIdleSeconds秒后使元素成为GS?如果在timeToIdleSeconds以上未使用元素,我希望清除内存。

Michael

java ehcache
2个回答
20
投票
Ehcache仅在放置元素且您的缓存高于阈值时才逐出元素。否则,访问那些过期的元素将导致它们过期(并从缓存中删除)。没有线程可以在后台从缓存中收集和删除过期的元素。即使我不建议这样做,因为这会影响Cache的性能(但是,如果内存使用更为重要,那么这可能是一个公平的折衷),您可以让后台线程定期执行getKeysWithExpiryCheck()。

同样,如果内存消耗是主要的问题,您可能需要研究新的Ehcache 2.5,它使您(即使在CacheManager级别上)也可以指定使用多少堆...


0
投票
强制GC并进行堆转储显示,这些元素收集到内存不足。

这真的很痛。为什么不创建一个称为expired-element-check-thread的线程来检查这些元素是否已过期?我可以看到diskStore具有此配置'diskExpiryThreadIntervalSeconds'

© www.soinside.com 2019 - 2024. All rights reserved.