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
- JVM學習(二)——GC垃圾回收機制JVMGC
- GC機制+字元編碼+檔案操作GC字元
- JDK 18 GC垃圾回收機制比較JDKGC
- 博文推薦|Pulsar 的訊息儲存機制和 Bookie 的 GC 機制原理GC
- Go反射機制ReflectGo反射
- 深入理解Java的垃圾回收機制(GC)實現原理JavaGC
- GO的GC辣雞回收(一)GoGC
- Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析Java虛擬機JVMGC
- 垃圾回收機制GC從JDK 8到JDK 17的效能提升 - kstefanjGCJDK
- Go記憶體分配和GC的理解Go記憶體GC
- JVM必備基礎知識(三)-- GC垃圾回收機制JVMGC
- Java gc(垃圾回收機制)小結,以及Android優化建議JavaGCAndroid優化
- Java 底層機制(JVM/堆/棧/方法區/GC/類載入)JavaJVMGC
- 面試官,不要再問我“Java GC垃圾回收機制”了面試JavaGC
- JVM 自動記憶體管理機制及 GC 演算法JVM記憶體GC演算法
- Go 包管理機制深入分析Go
- Go並不需要Java風格的GCGoJavaGC
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- Go通道機制與應用詳解Go
- 深入理解Go-垃圾回收機制Go
- Go語言錯誤處理機制Go
- Go小工具系列——重試機制Go
- Java常見知識點彙總(⑰)——垃圾回收機制(garbage collection-GC)JavaGC
- 聽說過對 Go map 做 GC 嗎?GoGC
- 為什麼Go不再需要Java風格的GC?- itnextGoJavaGC
- 深入理解GO語言之併發機制Go
- 用 Go 語言實作 Job Queue 機制Go
- 深入 Go 的錯誤處理機制,學會如何使用Go
- 深入 Go 的錯誤處理機制,理解設計思想Go
- Go sync.Cond:最容易被忽視的同步機制Go
- HDFS 02 - HDFS 的機制:副本機制、機架感知機制、負載均衡機制負載
- 從原始碼解析 Go 的切片型別以及擴容機制原始碼Go型別
- Go語言處理—Day11—反射機制Go反射
- JVM 虛擬機器 GCJVM虛擬機GC
- 通俗易懂剖析Go Channel:理解併發通訊的核心機制Go
- Go 函式的健壯性、panic異常處理、defer 機制Go函式
- 【GoLang 那點事】深入 Go 的錯誤處理機制 (一) 使用Golang