【问题标题】:Guava maximum cache sizeGuava 最大缓存大小
【发布时间】:2017-02-27 03:07:15
【问题描述】:

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

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

【问题讨论】:

  • 有人对此有什么想法吗?

标签: java heap-memory guava


【解决方案1】:

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

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

默认情况下,Cache 在这种情况下没有做任何特别的事情,JVM 会崩溃。大多数时候这是你想要的 - 从缓存中默默地删除元素可能会破坏你的程序的假设。

如果您确实想在遇到内存不足的情况时删除条目,您可以使用use soft referencesCacheBuilder.softValues()。当 JVM 面临可用堆空间不足的风险时,它会尝试对软引用进行垃圾收集。我鼓励您仅将此选项用作最后的手段 - JVM 必须做额外的工作来处理软引用,并且需要使用它们通常暗示您可以以不同的方式做其他事情。

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-03-31
    相关资源
    最近更新 更多