Guava Cache:被驱逐条目何时GC回收?weakValues行为差异解析
Guava Cache 内存回收与弱引用相关问题解答
一、过期移除的缓存条目何时被GC回收?
- Guava Cache的过期条目不会立即自动清理,仅会在以下时机触发过期检查与移除:
- 调用
get()/getIfPresent()等查询方法时,会检查目标条目是否过期 - 若配置
CacheBuilder.scheduler()开启后台维护线程,线程会定期扫描清理过期条目 - 手动调用
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
相关产品推荐
相关产品推荐

