番石榴最大缓存大小

时间:2016-10-18 01:29:33

标签: java heap google-guava-cache

我正在为我的应用程序使用Guava缓存,并想知道如果未设置maximumSize,默认行为是什么。我理解设置maximumSize时的行为,如https://github.com/google/guava/wiki/CachesExplained#size-based-eviction中所述。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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