2016-10-18 73 views
0

我对我的应用程序使用Guava缓存,并且想知道如果未设置maximumSize,默认行为将会是什么。我了解在设置maximumSize时的行为,如https://github.com/google/guava/wiki/CachesExplained#size-based-eviction中所述。番石榴最大缓存大小

但是,如果未设置maximumSize并且JVM用完堆空间,会发生什么情况?我假设垃圾收集器将运行并释放空间,这意味着条目将从缓存中删除?

+0

任何人有任何想法呢? – user320550

回答

0

掩护下一个Cache只是一个看中Map,所以它有类似的空间限制。像Map它不能包含多于Integer.MAX_VALUE条目(因为这是size()的返回类型),所以您的理论上限缓存大小为20亿个元素。您可能还对番石榴的awesome element-cost analysis感兴趣,它详细说明了不同数据结构使用的确切字节数。

当然在实践中真正关心的不是高速缓存中元素的数量(其大小),而是缓存对象所消耗的内存量。这与缓存的大小无关 - 单个缓存的对象可能足够大而占用了所有的堆。

默认情况下Cache在这种情况下不会做任何特殊的事情,并且JVM崩溃。大部分时间这就是你想要的 - 从缓存中静默删除元素可能会破坏你的程序的假设。

如果您确实想在内存不足的情况下删除条目,您可以使用use soft referencesCacheBuilder.softValues()。当JVM有可能耗尽可用堆空间时,它将尝试垃圾收集软引用。我鼓励你只使用这个选项作为最后的手段 - JVM必须做额外的工作来处理软引用,并且需要使用它们通常意味着你可能以其他方式做别的事情。