排查过程
使用arthas 抓取问题线程,curl -O https://arthas.aliyun.com/arthas-boot.jar; java -jar arthas-boot.jar ,
启动arthas后输入命令dashboard,
将整个显示内容粘贴到deepseek
线程分析结论
线程noBeanNameSet-0-C-1是导致CPU高占用的核心原因,其CPU使用率达15.26%,远高于其他线程。该线程为Caffeine缓存库的后台维护线程,负责执行缓存清理、淘汰等任务。

不合理配置示例
以下配置会导致频繁哈希表扩容,引发CPU资源消耗:

Caffeine.newBuilder()
    .expireAfterWrite(1, TimeUnit.DAYS)
    .initialCapacity(100)
    .maximumSize(10000)
    .build();

配置缺陷

  • initialCapacity(100)maximumSize(10000)差距过大,导致频繁扩容
  • 长过期时间(1天)使缓存条目长期存活,增加维护负担
  • 固定大小限制引发频繁淘汰计算

优化方案

@Bean
public Cache<String, Object> caffeineCache() {
  return Caffeine.newBuilder()
      .expireAfterWrite(4, TimeUnit.HOURS)  // 缩短过期时间
      .initialCapacity(10000)  // 预分配足够空间
      .recordStats()  // 开启监控
      .build();
}

优化要点

  • 移除maximumSize避免淘汰计算开销
  • 初始容量设置为预期最大容量
  • 缩短过期时间至业务合理范围
  • 添加监控便于后续调优

验证方法

  • 通过Arthas的dashboard命令观察优化后CPU占用
  • 使用vmtool命令检查缓存实例状态
  • 监控缓存命中率等指标
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐