1. 程式人生 > 其它 >Go - 使用 sync.Pool 來減少 GC 壓力

Go - 使用 sync.Pool 來減少 GC 壓力

目錄

前言

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 裡面的物件具體是什麼時候真正釋放,是由系統決定的。

小結

  1. 一定要注意儲存的是臨時物件!
  2. 一定要注意 Get 後,要呼叫 Put

以上,希望對你能夠有所幫助。

推薦閱讀

作者:新亮筆記(關注公眾號,可申請新增微信好友)
出處:https://www.cnblogs.com/xinliangcoder
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。