GOLANG關於全局變量引起的內存泄漏始末


 

代碼寫好部署上線,發現我的服務比其他微服務內存超出很多,並且內存使用增長很快、GC很慢。還好問題發現的快,不然后果就是把整個服務拖垮了。

開始使用pprof 性能分析工具定位。發現heap增量不明顯,調試各個接口,看不出問題。但是會出現,GC很慢或者說有些變量沒有被GC的現象,就是內存使用之后只GC部分,出現固定的內存使用增量。

了解到問題確實是由代碼造成,通過縮小接口范圍方式,確定出現問題的接口,review下代碼。看到有幾處代碼引用不規范:

在代碼中,調用初始化支付訂單和視頻點播服務,可以看到其中引用了全局變量,orderClient、videoClient。而代碼中,在接口層調用初始化服務,導致了服務多次初始化,大量的全局變量被聲明。最終導致內存不斷被重復申請,內存不斷上漲。

解決:

修改代碼:將服務聲明寫在服務啟動之前的位置,確保服務只在服務啟動時調用一次,代碼如下:

圖片描述

 

補充:訂單與視頻點播服務的封裝,可以使用單例模式,確保對象被申請一次,這么處理可更加安全,代碼:

圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM