垃圾收集将如何影响存储在堆上的 ehcache 元素?

How will garbage collection affect the elements of my ehcache that are stored on the heap?

我正在使用 Hibernate 4.3。11.Final 以及随附的 ehcache 版本。我有一个简单的缓存配置,如下所示:

<defaultCache maxElementsInMemory="10000"
     eternal="false"
     timeToIdleSeconds="86400"
     timeToLiveSeconds="86400"
     overflowToDisk="false"
     memoryStoreEvictionPolicy="LRU">
</defaultCache> 
<cache name="main" />

我的问题是,因为内存设置是堆的一部分,而且堆会定期进行垃圾回收,当我的缓存中的一些条目被垃圾回收时会发生什么?它与从缓存中逐出的条目相同吗?

垃圾收集 (GC) 永远不会从存在根路径的缓存中收集条目,因为它们由缓存本身引用。

为了回答有关堆外的问题,假设您决定在缓存中有 500k 个映射,并且每个映射为 10k 字节。这相当于将近 5GB 的缓存数据。在 运行 时对 GC 有影响的数据,因为它需要围绕它执行操作 - 标记、提升、压缩取决于 GC impl。因此,offheap 通过将对象放置在 GC 发生的区域之外来解决这个问题,以使应用程序能够 运行 使用更小的堆,从而减少 GC 暂停。

所有这些并不与 GC 永远不会删除缓存条目相矛盾。恰恰相反——一旦被逐出、过期或替换,只要不再有根路径,以前的映射就可以免费用于 GC。

这就是this answer中给出的解释。