You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Guava Cache:被驱逐条目何时GC回收?weakValues行为差异解析

Guava Cache 内存回收与弱引用相关问题解答

一、过期移除的缓存条目何时被GC回收?

  • Guava Cache的过期条目不会立即自动清理,仅会在以下时机触发过期检查与移除:
    1. 调用get()/getIfPresent()等查询方法时,会检查目标条目是否过期
    2. 若配置CacheBuilder.scheduler()开启后台维护线程,线程会定期扫描清理过期条目
    3. 手动调用cache.cleanUp()强制触发清理
  • 当条目被Guava Cache从内部存储结构中移除后,只要该条目对应的键/值没有其他外部强引用,下一次JVM执行垃圾回收(Minor或Full GC)时就会被回收。
  • 若你的应用出现内存持续增长,大概率是被移除的条目仍被其他代码持有强引用,导致GC无法回收,而非Guava Cache本身持有引用不放。

二、weakValues下COLLECTED驱逐的条目是否提前被GC回收?

  • 是的,这是weakValues()的预期行为:
    • 使用weakValues()时,Guava会将缓存的值包装成弱引用存储。弱引用的特性是:只要JVM触发GC,且该值没有其他强引用指向它,就会被GC直接回收,完全不受缓存过期时间、最大容量限制的约束。
    • 当Guava检测到弱引用指向的值被GC回收后,会将对应缓存条目标记为COLLECTED类型并驱逐,这个过程确实发生在过期(EXPIRED)或大小限制(SIZE)触发之前。
  • 你看到部分条目是COLLECTED,其余是EXPIRED/SIZE,说明:
    • COLLECTED条目对应的对象没有其他强引用,GC触发后就被回收
    • EXPIRED/SIZE条目对应的对象仍被强引用持有,GC无法回收,直到缓存的过期时间到达或容量满了才被主动移除

内容的提问来源于stack exchange,提问作者programmerlife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:45:41