常见的缓存回收策略
Posted 沛沛老爹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的缓存回收策略相关的知识,希望对你有一定的参考价值。
1.基于空间
基于空间指缓存设置了存储空间,如设置为50MB,当达到存储空间上限时,按照一定的策略移除数据。
2.基于容(数)量
基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略移除旧数据。
3.基于时间
TTL(Time To Live ): 存活期,即缓存数据从创建开始直到到期的一个时间段(不管在这个时间段内有没有被访问,缓存数据都将过期)。
TTI(Time To Idle): 空闲期,即缓存数据多久没被访问后移除缓存的时间。
4.基于Java对象引用
软引用 :如果一个对象是软引用,那么当JVM堆内存不足时,垃圾回收器可以回收这些对象。软引用适合用来做缓存,从而当JVM堆内存不足时,可以回收这些对象腾出一些空间供强引用对象使用,从而避免OOM。
弱引用 :当垃圾回收器回收内存时,如果发现弱引用,则将它立即回收。相对于软引用,弱引用有更短的生命周期。
注意: 只有在没有其他强引用对象引用弱引用/软引用对象时,垃圾回收时才回收该引用。即如果有一个对象(不是弱引用/软引用对象)引用了弱引用/软引用对象,那么垃圾回收时不会回收该弱引用/软引用对象。
5.回收算法
使用基于空间和基于容量的缓存会使用一定的策略移除旧数据,常见的如下。
FIFO(First In First Out): 先进先出算法,即先放入缓存的先被移除。
LRU(Least Recently Used): 最近最少使用算法,使用时间距离现在最久的那个被移除。
LFU(Least Frequently Used): 最不常用算法,一定时间段内使用次数(频率)最少的那个被移除。
实际应用中基于LRU的缓存居多,如Guava Cache、Ehcache支持LRU。
以上是关于常见的缓存回收策略的主要内容,如果未能解决你的问题,请参考以下文章