Guava Cache:核心参数深度剖析和相关源码分析

目录

1、核心参数概览

2、核心参数分功能分析

2.1 初始容量initialCapacity

2.2 最大容量maximumSize

2.3 加权器weigher和最大加权值maximumWeight

2.4 写后超时expireAfterWrite和读后超时expireAfterRead

2.5 写后刷新refreshAfterWrite

2.6 并发级别concurrencyLevel

2.7 时间源ticker

2.8 缓存移除监听器removalListener

2.9 软引用和弱引用

2.10 结果统计recordStats

2.11 缓存加载器CacheLoader


    这篇文章主要分析Guava Cache的核心参数,对Guava Cache感兴趣的同学,可以结合另一篇整体分析Guava Cache原理的文章来了解Guava Cache:Guava Cache:原理详解

1、核心参数概览

2、核心参数分功能分析

2.1 初始容量initialCapacity

1、主要作用:

    initialCapacity表示初始容量,在缓存创建的过程中进行设置。注意事项:

  • 不可重复设置:初始容量只能设置一次有效值,否则会抛出异常;
  • 最小值限制:初始容量应该大于等于0,否则会抛出异常;
  • 最大值限制:initialCapacity会从2的30次方、maximumWeight、CacheBuilder的传入值中取最小值;
  • 并发性相关:initialCapacity最好设置成段数segmentCount(segmentCount的计算参加:? )的整数倍,因为initialCapacity用来设置段的初始容量segmentCapacity,segmentCapacity取值即initialCapacity除以segmentCount并向上取整。

2、核心代码:

    1)CacheBuilder中设置初始容量的代码:

  public CacheBuilder<K, V> initialCapacity(int initialCapacity) {
    checkState(
        this.initialCapacity == UNSET_INT,
        "initial capacity was already set to %s",
        this.initialCapacity);
    checkArgument(initialCapacity >= 0);
    this.initialCapacity = initialCapacity;
    return this;
  }

    2)LocalCache构造器中initialCapacity取值:

    int initialCapacity = Math.min(builder.getInitialCapacity(), MAXIMUM_CAPACITY);
    if (evictsBySize() && !customWeigher()) {
      initialCapacity = (int) Math.min(initialCapacity, maxWeight);
    }

    3)LocalCache构造器中initialCapacity用来计算段的初始容量:

    int segmentCapacity = initialCapacity / segmentCount;
    if (segmentCapacity * segmentCount < initialCapacity) {
      ++segmentCapacity;
    }

2.2 最大容量maximumSize

1、主要作用:

    用来形容缓存的最大容量,以避免缓存过多导致内存泄露。注意事项:

  • 实质:maximumSize主要是用来设置maxWeight,在缓存内部是通过maxWeight来限制缓存容量的;
  • 不可重复设置:最大容量只能设置一次有效值,否则会抛出异常;最大容量和最大权重maxWeight只允许设置一个,否则会抛出异常;

    和最大权重对比:

  • 相同性:在缓存没有特殊加权计算的情况下,两者等价,只需设置任意即可;
  • 差异性1:有特殊加权值计算(指定weigher)的场景,必须也只能使用最大权重maximumWeight;
  • 差异性2:在没有特殊加权值计算(指定weigher)的场景,必须也只能使用最大大小maximumSize;
  • 差异性3:在缓存实例内部,成员变量使用的是最大权重maximumWeight,maximumSize会通过转化成maxWeight来生效。

2、核心代码:

    1)CacheBuilder中设置最大容量的代码:

  public CacheBuilder<K, V> maximumSize(long maximumSize) {
    checkState(
        this.maximumSize == UNSET_INT, "maximum size was already set to %s", this.maximumSize);
    checkState(
        this.maximumWeight == UNSET_INT,
        "maximum weight was already set to %s",
        this.maximumWeight);
    checkState(this.weigher == null, "maximum size can not be combined with weigher");
    checkArgument(maximumSize >= 0, "maximum size must not be negative");
    this.maximumSize = maximumSize;
    return this;
  }

    2)获取最大加权值:maximumSize和maximumWeight是否生效取决于是否指定了weigher

  long getMaximumWeight() {
    if (expireAfterWriteNanos == 0 || expireAfterAccessNanos == 0) {
      return 0;
    }
    return (weigher == null) ? maximumSize : maximumWeight;
  }

2.3 加权器weigher和最大加权值maximumWeight

1、加权的主要作用:

    加权器weigher主要用来根据缓存的key-value来设置不同的加权值。加权值表示占据的内存的基本单元数据的多少。注意事项:

  • 缺省值:CacheBuilder中可以不设置weigher,此时weigher为null;构造缓存LocalCache实例时,如果weigher为null则使用OneWeigher.INSTANCE;
  • 和最大容量参数的关系:指定weigher时,最大容量只能使用maximumWeight;不指定weigher时,最大容量只能使用maximumSize;
  • 自定义方式:实现weigher接口

2、最大加权值的作用:

    最大加权值,在CacheBuilder中使用字段名maximumWeight,在LocalCache中使用字段名maxWeight,用来描述缓存的最大容量。注意事项:

  • 使用场景:只有在设置了weigher的时候,才会使用maximumWeight;否则使用maximumSize;
  • 内部机制:在缓存LocalCache的内部,使用的是maxWeight;如果没有指定weighter,会将CacheBuilder中的maximumSize读取为maxWeight;
  • 生效方式:对每个分段计算一个最大分段加权值;
  • 缺省值:-1,此时不会限制缓存容量;-1无法显示设置,不设置即为-1.
  • </
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值