Flux.cache()无TTL配置时缓存数据的存储时长与内存回收疑问
Flux.cache() 无TTL时的缓存行为与内存管理
核心问题解答
1. 无TTL时的缓存存储时长
使用无参数的Flux.cache()时,缓存的所有数据会永久保留在内存中,直到缓存的Flux实例被Java垃圾回收(GC)回收。该重载方法没有内置过期策略,数据一旦被缓存,就会驻留内存,除非持有这个Flux实例的引用被全部释放,GC才会清理缓存的数据。
2. 内存泄漏风险与自动清理逻辑
在你的Spring Boot主HTTP请求场景中,缓存的生命周期取决于Flux实例的引用范围:
- 如果缓存的Flux实例是绑定到单个主HTTP请求上下文的(比如仅在当前请求的处理流程中创建、使用,未被全局Bean、静态变量等长期存活组件持有),那么当主API的Mono终止(请求处理完成)后,该Flux实例会失去有效引用,后续GC会自动回收它及缓存的数据,不会造成内存泄漏。
- 若缓存的Flux实例被长期持有引用(比如注入到全局组件、存入静态集合),缓存数据会一直占用内存,直到应用重启或手动清除引用,这种情况可能引发内存泄漏,建议改用带TTL的
cache(Duration)重载方法,或在合适时机主动丢弃缓存实例。
补充说明
无参数的Flux.cache()底层基于ReplayProcessor实现,它没有内置的缓存清理机制,完全依赖Java的垃圾回收机制释放内存。官方文档虽未直接明确缓存时长,但从实现逻辑可推导:无TTL配置时,缓存数据会一直保留到实例被回收。
内容的提问来源于stack exchange,提问作者vlishchynskyi
相关产品推荐
相关产品推荐

