如何通过SoftReference构建内存敏感二级缓存,掌握其回收机制?

2026-05-07 17:360阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计879个文字,预计阅读时间需要4分钟。

如何通过SoftReference构建内存敏感二级缓存,掌握其回收机制?

软引用适合作为内存敏感的二级行为缓存,但其回收并非内存一紧张就清除,而是由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分钟。

如何通过SoftReference构建内存敏感二级缓存,掌握其回收机制?

软引用适合作为内存敏感的二级行为缓存,但其回收并非内存一紧张就清除,而是由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 时就大概率被清掉。

阅读全文