如何通过SoftReference构建内存敏感二级缓存,掌握其回收机制?
- 内容介绍
- 相关推荐
本文共计879个文字,预计阅读时间需要4分钟。
软引用适合作为内存敏感的二级行为缓存,但其回收并非内存一紧张就清除,而是由JVM结合堆空间空闲率、软引用使用率、长时间未使用和GC类型共同决定——关键在于理解其非主动、非实时、看时机的特性。
软引用的回收时机:不是 Full GC 就收,而是“看空闲堆+算闲置时间”
SoftReference 指向的对象不会在 Minor GC 中被处理,只有在触发 Full GC 且堆内存仍不足时,JVM 才会考虑回收。但是否真回收,还要看两个硬条件:
- 对象没有强引用链可达(即已脱离业务主流程)
- 该软引用的“闲置时间”超过阈值:clock − timestamp > heap_free_mb × -XX:SoftRefLRUPolicyMSPerMB(默认每 MB 空闲堆允许存活 1000ms)
例如:当前堆空闲 50MB,按默认策略,软引用最多可闲置 50 × 1000 = 50,000ms(50秒);若某缓存项 60 秒没被 get() 访问过,下次 Full GC 时就大概率被清掉。
本文共计879个文字,预计阅读时间需要4分钟。
软引用适合作为内存敏感的二级行为缓存,但其回收并非内存一紧张就清除,而是由JVM结合堆空间空闲率、软引用使用率、长时间未使用和GC类型共同决定——关键在于理解其非主动、非实时、看时机的特性。
软引用的回收时机:不是 Full GC 就收,而是“看空闲堆+算闲置时间”
SoftReference 指向的对象不会在 Minor GC 中被处理,只有在触发 Full GC 且堆内存仍不足时,JVM 才会考虑回收。但是否真回收,还要看两个硬条件:
- 对象没有强引用链可达(即已脱离业务主流程)
- 该软引用的“闲置时间”超过阈值:clock − timestamp > heap_free_mb × -XX:SoftRefLRUPolicyMSPerMB(默认每 MB 空闲堆允许存活 1000ms)
例如:当前堆空闲 50MB,按默认策略,软引用最多可闲置 50 × 1000 = 50,000ms(50秒);若某缓存项 60 秒没被 get() 访问过,下次 Full GC 时就大概率被清掉。

