代码写好部署上线,发现我的服务比其他微服务内存超出很多,并且内存使用增长很快、GC很慢。还好问题发现的快,不然后果就是把整个服务拖垮了。
开始使用pprof 性能分析工具定位。发现heap增量不明显,调试各个接口,看不出问题。但是会出现,GC很慢或者说有些变量没有被GC的现象,就是内存使用之后只GC部分,出现固定的内存使用增量。
了解到问题确实是由代码造成,通过缩小接口范围方式,确定出现问题的接口,review下代码。看到有几处代码引用不规范:
在代码中,调用初始化支付订单和视频点播服务,可以看到其中引用了全局变量,orderClient、videoClient。而代码中,在接口层调用初始化服务,导致了服务多次初始化,大量的全局变量被声明。最终导致内存不断被重复申请,内存不断上涨。
解决:
修改代码:将服务声明写在服务启动之前的位置,确保服务只在服务启动时调用一次,代码如下: