GOLANG关于全局变量引起的内存泄漏始末

 

代码写好部署上线,发现我的服务比其他微服务内存超出很多,并且内存使用增长很快、GC很慢。还好问题发现的快,不然后果就是把整个服务拖垮了。

开始使用pprof 性能分析工具定位。发现heap增量不明显,调试各个接口,看不出问题。但是会出现,GC很慢或者说有些变量没有被GC的现象,就是内存使用之后只GC部分,出现固定的内存使用增量。

了解到问题确实是由代码造成,通过缩小接口范围方式,确定出现问题的接口,review下代码。看到有几处代码引用不规范:

在代码中,调用初始化支付订单和视频点播服务,可以看到其中引用了全局变量,orderClient、videoClient。而代码中,在接口层调用初始化服务,导致了服务多次初始化,大量的全局变量被声明。最终导致内存不断被重复申请,内存不断上涨。

解决:

修改代码:将服务声明写在服务启动之前的位置,确保服务只在服务启动时调用一次,代码如下:

图片描述

 

补充:订单与视频点播服务的封装,可以使用单例模式,确保对象被申请一次,这么处理可更加安全,代码:

图片描述

posted @ 2020-08-18 11:32  pgman  阅读(942)  评论(0编辑  收藏  举报