Go - 使用 sync.Pool 來減少 GC 壓力
阿新 • • 發佈:2021-10-30
目錄
前言
sync.Pool
是臨時物件池,儲存的是臨時物件,不可以用它來儲存 socket
長連線和資料庫連線池等。
sync.Pool
本質是用來儲存和複用臨時物件,以減少記憶體分配,降低 GC 壓力,比如需要使用一個物件,就去 Pool 裡面拿,如果拿不到就分配一份,這比起不停生成新的物件,用完了再等待 GC 回收要高效的多。
sync.Pool
sync.Pool
的使用很簡單,看下示例程式碼:
package student import ( "sync" ) type student struct { Name string Age int } var studentPool = &sync.Pool{ New: func() interface{} { return new(student) }, } func New(name string, age int) *student { stu := studentPool.Get().(*student) stu.Name = name stu.Age = age return stu } func Release(stu *student) { stu.Name = "" stu.Age = 0 studentPool.Put(stu) }
當使用 student
物件時,只需要呼叫 New()
方法獲取物件,獲取之後使用 defer
函式進行釋放即可。
stu := student.New("tom", 30)
defer student.Release(stu)
// 業務邏輯
...
關於 sync.Pool
裡面的物件具體是什麼時候真正釋放,是由系統決定的。
小結
- 一定要注意儲存的是臨時物件!
- 一定要注意
Get
後,要呼叫Put
!
以上,希望對你能夠有所幫助。
推薦閱讀
作者:新亮筆記(關注公眾號,可申請新增微信好友)
出處:https://www.cnblogs.com/xinliangcoder
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。