Go GC 機制的大坑

liyue201發表於2020-02-19

現象:一個 go 寫的服務,有 1G 的快取資料,這部分的資料只有關閉服務才會釋放,剛啟動服務的時候通過 top 命令,顯示使用 1G 記憶體,之後逐漸漲到 2G 多才穩定下來。

原因: 跟 Go 的 GC 機制有關。go 有個環境變數 GOGC,預設是 100,意思是每次 GC 之後,下一次觸發 GC 的條件為:當記憶體使用量達到上一次 GC 記憶體的 100%。所以上面的例子中 GC 之後快取中的記憶體沒有釋放,下次觸發 GC 的條件是記憶體達到 2G 時。

解決辦法: 在程式中通過 debug.SetGCPercent() 來修改這個值。比如改成 50,那麼服務使用的記憶體將在 1.5G 左右穩定下來。

go 的 GC 機制對於有快取的服務是個大坑,他使得兩次 GC 的時間間隔大大的拉長了。

更多原創文章乾貨分享,請關注公眾號
  • Go GC 機制的大坑
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章