如何在Caffeine缓存管理器中设置最大内存使用量(如1GiB)?
Caffeine缓存设置最大内存使用量
要给Caffeine缓存设置固定最大内存(比如1GiB),核心是通过权重(Weight)机制来控制——因为Caffeine的maximumSize是按条目数量限制,而内存限制需要结合每个条目的内存占用计算总权重。以下是不同场景的实现方式:
纯Java环境
- 定义内存权重计算器:实现
Weigher接口,估算每个缓存条目的内存占用(单位:字节)。简单场景可根据对象类型估算;若需精确值,可借助JVM的InstrumentationAPI。 - 构建缓存时指定总权重上限(1GiB = 102410241024字节)和权重计算器。
import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Weigher; // 示例:简单估算每个缓存值占用1KB内存(根据实际场景调整) Weigher<String, Object> memoryWeigher = (key, value) -> 1024; // 构建最大内存1GiB的缓存 Cache<String, Object> cache = Caffeine.newBuilder() .maximumWeight(1024 * 1024 * 1024) // 总权重=1GiB字节数 .weigher(memoryWeigher) .build();
如果需要精确计算对象内存,可使用Instrumentation:
import java.lang.instrument.Instrumentation; // 假设已通过Agent获取到Instrumentation实例 Instrumentation instrumentation = ...; Weigher<String, Object> preciseWeigher = (key, value) -> (int) instrumentation.getObjectSize(value); Cache<String, Object> preciseCache = Caffeine.newBuilder() .maximumWeight(1024 * 1024 * 1024) .weigher(preciseWeigher) .build();
Spring Boot环境
在Spring Boot中,通过自定义CacheManager来配置内存限制:
import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Weigher; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.caffeine.CaffeineCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableCaching public class CaffeineCacheConfig { @Bean public CaffeineCacheManager cacheManager() { Weigher<String, Object> memoryWeigher = (key, value) -> 1024; // 内存估算逻辑 Caffeine<Object, Object> caffeineConfig = Caffeine.newBuilder() .maximumWeight(1024 * 1024 * 1024) .weigher(memoryWeigher); CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(caffeineConfig); return cacheManager; } }
补充说明
- 当总权重达到设定的1GiB上限时,Caffeine会默认使用**LRU(最近最少使用)**策略自动淘汰旧条目。
- 如果不需要严格的固定内存限制,仅希望在JVM内存不足时回收缓存,可使用
softValues()(依赖JVM的软引用机制):
Cache<String, Object> cache = Caffeine.newBuilder() .softValues() .build();
内容的提问来源于stack exchange,提问作者Wiktor
相关产品推荐
相关产品推荐

