我正在使用Hibernate 4.3.11.Final和随附的ehcache版本。我有一个简单的缓存配置,如下所示:
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="86400"
timeToLiveSeconds="86400"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
<cache name="main" />
我的问题是,因为内存设置是堆的一部分而且堆定期进行垃圾收集,当我的缓存中的某些条目被垃圾收集时会发生什么?是否与从缓存中逐出的条目相同?
答案 0 :(得分:0)
垃圾收集(GC)永远不会从具有根路径的缓存中收集条目,因为它们被缓存本身引用。
要回答关于offheap的问题,假设你决定在缓存中有500k映射,每个映射都是10k字节。这相当于近5GB的缓存数据。运行时对GC有影响的数据,因为它需要围绕它执行操作 - 标记,促销和压缩取决于GC impl。因此,offheap通过将对象放置在GC发生的区域之外来解决此问题,以便使应用程序能够以更小的堆运行,从而减少GC暂停。
所有这一切并不矛盾,因为GC永远不会删除缓存条目。相反 - 一旦被驱逐,过期或被替换,只要没有更多的根路径,GC的前映射就变得免费。
这就是this answer中给出的解释所说的。