代碼寫好部署上線,發現我的服務比其他微服務內存超出很多,並且內存使用增長很快、GC很慢。還好問題發現的快,不然后果就是把整個服務拖垮了。
開始使用pprof 性能分析工具定位。發現heap增量不明顯,調試各個接口,看不出問題。但是會出現,GC很慢或者說有些變量沒有被GC的現象,就是內存使用之后只GC部分,出現固定的內存使用增量。
了解到問題確實是由代碼造成,通過縮小接口范圍方式,確定出現問題的接口,review下代碼。看到有幾處代碼引用不規范:
在代碼中,調用初始化支付訂單和視頻點播服務,可以看到其中引用了全局變量,orderClient、videoClient。而代碼中,在接口層調用初始化服務,導致了服務多次初始化,大量的全局變量被聲明。最終導致內存不斷被重復申請,內存不斷上漲。
解決:
修改代碼:將服務聲明寫在服務啟動之前的位置,確保服務只在服務啟動時調用一次,代碼如下:
補充:訂單與視頻點播服務的封裝,可以使用單例模式,確保對象被申請一次,這么處理可更加安全,代碼: