Java中如何构建依赖SoftReference的高级缓存,仅在内存紧张时释放?
- 内容介绍
- 文章标签
- 相关推荐
本文共计801个文字,预计阅读时间需要4分钟。
SoftReference适合构建内存敏感的缓存——它不会在每次GC时被回收,而是在JVM判断内存不足(可能是即将发生OOM前)时才进行批量清理。但要注意:
理解 SoftReference 的回收逻辑
JVM 对 SoftReference 的回收遵循“最近最少使用(LRU-like)+ 内存压力”双重策略:
- HotSpot 默认以“最后一次访问时间”为依据:越久未访问的 SoftReference 越先被回收;
- 回收触发条件是 GC 时可用堆内存低于某个阈值(由 -XX:SoftRefLRUPolicyMSPerMB 控制,默认 1000ms/MB,即每兆空闲堆内存允许软引用存活约 1 秒);
- Full GC 比 Young GC 更可能回收 SoftReference,但并非绝对——即使老年代充足,若整个堆接近耗尽,也会回收。
构建带容量与访问感知的软引用缓存
单纯用 Map<k softreference>></k> 容易导致缓存无限膨胀或过早失效。
本文共计801个文字,预计阅读时间需要4分钟。
SoftReference适合构建内存敏感的缓存——它不会在每次GC时被回收,而是在JVM判断内存不足(可能是即将发生OOM前)时才进行批量清理。但要注意:
理解 SoftReference 的回收逻辑
JVM 对 SoftReference 的回收遵循“最近最少使用(LRU-like)+ 内存压力”双重策略:
- HotSpot 默认以“最后一次访问时间”为依据:越久未访问的 SoftReference 越先被回收;
- 回收触发条件是 GC 时可用堆内存低于某个阈值(由 -XX:SoftRefLRUPolicyMSPerMB 控制,默认 1000ms/MB,即每兆空闲堆内存允许软引用存活约 1 秒);
- Full GC 比 Young GC 更可能回收 SoftReference,但并非绝对——即使老年代充足,若整个堆接近耗尽,也会回收。
构建带容量与访问感知的软引用缓存
单纯用 Map<k softreference>></k> 容易导致缓存无限膨胀或过早失效。

