公司有个系统大概两周左右cpu飙高,访问量不大
运维给了火焰图, 看火焰图大概明白是什么问题,频繁的线程切换,很可能是增加一个线程没有释放,线程不断增加,线程占cpu时间,cpu不停的切换线程
有这个方向就容易想到,看一下线程快照,发现又4000多个nacos client线程,问题就明显了,接下来就要找到创建nacos client的地方,nacos client一般集成spring cloud实例,不会出问题,主要是找手动创建的代码。使用调用ide的call hirerarchy
果然,创建了ConfigService,没有关闭,写这个代码的程序员是懂gc,认为服务会回收,但gc不会回收线程,ConfigService内嵌一个worker,打开线程不停刷最新的配置
总结,这个问题排查比较简单,但有点值得注意,通常认为gc会帮我们回收服务资源,新建服务不会手动关闭,但对于像ConfigService这样的服务,打开了一个驻留线程需要手动关闭,当然最好使用单例模式。