You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Caffeine缓存管理器中设置最大内存使用量(如1GiB)?

Caffeine缓存设置最大内存使用量

要给Caffeine缓存设置固定最大内存(比如1GiB),核心是通过权重(Weight)机制来控制——因为Caffeine的maximumSize是按条目数量限制,而内存限制需要结合每个条目的内存占用计算总权重。以下是不同场景的实现方式:

纯Java环境

  1. 定义内存权重计算器:实现Weigher接口,估算每个缓存条目的内存占用(单位:字节)。简单场景可根据对象类型估算;若需精确值,可借助JVM的Instrumentation API。
  2. 构建缓存时指定总权重上限(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:54:18