Go GC 機制的大坑
現象:一個 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 的時間間隔大大的拉長了。
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 聊聊JVM的垃圾回收機制GCJVMGC
- GC機制和OutOfMemory問題的診斷GC
- JVM學習(二)——GC垃圾回收機制JVMGC
- JDK 18 GC垃圾回收機制比較JDKGC
- Android GC機制實踐調研AndroidGC
- GC垃圾回收機制: 淺析與理解GC
- GC機制+字元編碼+檔案操作GC字元
- 博文推薦|Pulsar 的訊息儲存機制和 Bookie 的 GC 機制原理GC
- Go反射機制ReflectGo反射
- JVM結構、GC工作機制詳解JVMGC
- .NET垃圾回收(GC)機制效能優化方案GC優化
- GO的GC辣雞回收(一)GoGC
- Java虛擬機器5:Java垃圾回收(GC)機制詳解Java虛擬機GC
- 深入理解JVM的記憶體結構及GC機制JVM記憶體GC
- Go語言Interface機制解析Go
- Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析Java虛擬機JVMGC
- 垃圾回收機制GC從JDK 8到JDK 17的效能提升 - kstefanjGCJDK
- Go記憶體分配和GC的理解Go記憶體GC
- Go 包管理機制深入分析Go
- JVM必備基礎知識(三)-- GC垃圾回收機制JVMGC
- 面試官,不要再問我“Java GC垃圾回收機制”了面試JavaGC
- JVM 自動記憶體管理機制及 GC 演算法JVM記憶體GC演算法
- Java 底層機制(JVM/堆/棧/方法區/GC/類載入)JavaJVMGC
- 從C#垃圾回收(GC)機制中挖掘效能優化方案C#GC優化
- Go並不需要Java風格的GCGoJavaGC
- 深入理解Go-垃圾回收機制Go
- Go小工具系列——重試機制Go
- Go通道機制與應用詳解Go
- Go GC:Go 1.5 將會解決延遲問題GoGC
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- Java gc(垃圾回收機制)小結,以及Android優化建議JavaGCAndroid優化
- 用 Go 語言實作 Job Queue 機制Go
- 深入理解GO語言之併發機制Go
- Go net/http 超時機制完全手冊GoHTTP
- 深入 Go 的錯誤處理機制,理解設計思想Go
- 深入 Go 的錯誤處理機制,學會如何使用Go
- Java常見知識點彙總(⑰)——垃圾回收機制(garbage collection-GC)JavaGC
- 聽說過對 Go map 做 GC 嗎?GoGC