Ehcache的文档指出,堆层需要进行Java垃圾收集(与“堆外层和磁盘”存储相反)。
现在,这是否意味着堆层中的对象可以被GC自发删除?显然,当它们过期或空间不足时,它们会被Ehcache删除-这是一个明确的行为。但是最重要的是,GC是否可以像这样随机地杀死一些对象,甚至不将它们移到较低的层?
答案 0 :(得分:5)
GC不会收集活动对象,即is reachable from a live thread的对象。堆上的Ehcache存储中的对象可以访问,因此不会被收集。
Ehcache曾经尝试使用WeakReference
,但是according to this post这个想法被放弃了:
我认为这是一个好主意。在生产中,由于元素随机消失,因此最终的储藏室看起来像瑞士奶酪。我希望VM保留所有元素,只在内存用完之前开始丢弃。不是这样大约8个月前,它已被删除,尽管我今天在Java文档中提到了一些参考文献。
答案 1 :(得分:0)
不。 GC将永远不会从缓存中删除任何对象。 Ehcache不使用任何弱引用或软引用。
您提到的那句话只是说明堆中缓存的条目是堆中的。因此,它们将由GC维护。因此,如果缓存很大,则堆很大,您需要相应地调整GC以防止它减慢速度。同样,缓存条目倾向于在旧的一代中使用。因此,您可能需要高效的旧式GC。
堆外存储根本不会出现此问题。但是,由于需要序列化,因此添加和检索条目会稍微慢一些。