问题背景
线上经常会出现网关服务掉线的情况,排查看之后,发现会产生OOM的错误,生成对应的错误文件。
问题复盘
究其原因,发现,是在创建新的进程时,内存不足导致。
采用arthas 进行查看下内存占用、线程数量,发现有大量的线程产生
大量的nacos线程,压垮了系统的运行
优化后的线程图如下:
优化前,线程数达到几万个
一堆工具,开始找寻排查问题的那个
当知道thread激增之后,就要去看下,为啥出现这么多线程。追踪源码,能够产生线程的最终是NacosServiceManger
vmtool —action getInstances —className demo.MathGame —express ‘instances.length’
通过示例命令,构造自己命令,查询NacosServiceManger运行实例。结果发现出现了一堆。
好吧,一个这玩意,就能带来指数式增长,因为内部是通过线程池实现,NamingProxy
so,根源找到了。就看下NacosServiceManger是如何产生那么多的。
问题解决
核心根源在于写自己的配置的时候,采用了new进行不断生成,ok,改掉
第一次,写了个单例获取示例
ok,基本优化完毕
第二次,仔细遍历源码,不该出现这么次的bug,应该有能够使用该对象的实现。果然发现它注入到容器内了,直接引用。
完事。。。