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

时间:2012-01-12 15:54:51

标签: java ehcache

  1. ehcache 2.5
  2. timeToIdleSeconds =“1800”(30分钟),所以我希望元素在闲置30分钟后逐出
  3. 在最后一次使用Element后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"
    
  9. 从上面我看到,ehcache给人的印象是,元素已过期,这可能会导致我的代码逻辑刷新它们但在引擎盖下内存会被元素污染,直到我调用特定元素或getKeysWithExpiryCheck(),这不会让我使用ehcache作为有效的记忆管理器

    如何在timeToIdleSeconds时间后将元素设为GS?如果在timeToIdleSeconds之上没有使用元素,我希望清理内存。

    迈克尔

1 个答案:

答案 0 :(得分:20)

Ehcache只会在放置元素并且缓存高于阈值时逐出元素。否则,访问这些过期元素将导致它们过期(并从缓存中删除)。没有线程在后台从Cache中收集和删除过期的元素。即使我不推荐它,因为这会影响Cache的性能(但如果内存使用更重要,这可能是一个公平的权衡),你可以让一个后台线程定期执行getKeysWithExpiryCheck()。

此外,如果内存消耗是主要问题,您可能需要查看新的Ehcache 2.5,它允许您(甚至在CacheManager级别)指定应该使用多少堆...