go資深之路筆記(二) sync.Pool

一、 使用 sync.Pool 減少 GC 壓力,提升性能

簡單講下go的gc,它的核心原理就是三色標記法和寫屏障,可以實現優秀并發處理。gc一般不會頻繁調用,他是根據GOGC的值來判斷,具體就是上次觸發GC后總堆值大于等于上次的(1+GOGC/100)倍,就會觸發gc。所以為了不出現gc頻繁調用損耗性能,一般會采用:增大GOGC值(得測試不能隨便調);盡量減少堆的產生:1.使用棧變量 2. 使用sync.pool 對象池 的辦法,這里講sync.pool
為什么sync.pool可以減少gc壓力:
sync.pool 對象池的變量是重復使用的,高頻持續創建銷毀的場景,它用的內存一直都是對象池開辟的那一塊,所以不會導致總堆增大很多;
常見場景:緩沖緩存區
代碼示例:

var requestBodyPool = sync.Pool{New: func() interface{} {return bytes.NewBuffer(make([]byte, 0, 1024)) // 預分配 1KB 的初始容量},
}func Handler(w http.ResponseWriter, r *http.Request) {// 從池中獲取一個 Buffer,并斷言為*bytes.Bufferbuf := requestBodyPool.Get().(*bytes.Buffer)buf.Reset()	// 重置數據,防止臟數據污染// 確保在處理完畢后將其放回池中defer func() {requestBodyPool.Put(buf)	// 回收數據}()// ... 處理結果并返回響應
}

要注意的坑點:
1.數據取出來要斷言,斷言有panic的風險(直接封裝一個 sync.pool的結構體,能避免這個問題)
2.數據取出來后一定要 重置,不然就是臟數據
3. 最好 采用 defer xxxpool.Put(buf)的方法,不然中間panic了數據沒回收
4. 高頻持續的場景才適用 sync.pool,不然效果不大甚至反效果
5. 如果pool存的是切片,需要回收的時候可以判斷切片大小,太大的切片可以直接放棄put。因為put之后切片再對象池不會被回收,總堆會升高,這樣也會導致頻繁gc

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96684.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【面試筆記-Java開發崗】

目錄:1. synchronized 和 ReentrantLock 的區別及應用場景2. HashMap 與 LinkedHashMap 的區別3. ConcurrentHashMap 的數據結構及 JDK1.7 與 JDK1.8 區別4. Spring 常用的模式及應用場景5. 事務的四大特性(ACID)6. 鎖機制:行級鎖…

CSS :has() 選擇器詳解:為什么它是“父選擇器”?如何實現真正的容器查詢?

一、前言 在傳統的 CSS 中,我們只能根據元素的自身屬性、類名、ID 或其子元素/兄弟元素來設置樣式,卻無法根據其父元素或后代元素的狀態來改變自身樣式。 直到 :has() 選擇器的出現,這一局面被徹底改變。 :has() 被稱為 “父選擇器” 或 “…

李宏毅 Deep Learning

感謝李宏毅老師qwq1. 基礎概念1.1 Machine Learning問題引出:預測后面幾天的觀看人數;初步構建模型:擬合效果不好,就是在原數據上平移了一段距離;此處構建模型的本質:利用特征工程,將“多維特征…

【AI論文】分享即關愛:基于集體強化學習經驗共享的高效語言模型(LM)后訓練方法

摘要:利用強化學習(RL)對語言模型(LMs)進行后訓練,無需監督微調即可增強其復雜推理能力,DeepSeek-R1-Zero便證明了這一點。然而,要有效利用強化學習訓練語言模型,需要進行…

工業網關在汽車沖壓車間的應用:EtherNet/IP轉EtherCAT集成實踐

在汽車零部件沖壓車間中,生產線的高效協同與精準控制是提升整體產能的關鍵。隨著自動化設備的多樣化,不同協議的設備之間的通信成為技術難點。例如,羅克韋爾PLC通常采用EtherNet/IP協議,而許多高性能機械臂則依賴EtherCAT協議。如…

【底層機制】【C++】std::move 為什么引入?是什么?怎么實現的?怎么正確用?

C++底層機制推薦閱讀 【C++基礎知識】深入剖析C和C++在內存分配上的區別 【底層機制】【C++】vector 為什么等到滿了才擴容而不是提前擴容? 【底層機制】malloc 在實現時為什么要對大小內存采取不同策略? 【底層機制】剖析 brk 和 sbrk的底層原理 【底層機制】為什么棧的內存…

Redis面試相關

數據過期策略 惰性刪除 當用到那個key的時候再檢查是否過期,過期則刪除,有效則返回key 優點是可以節省檢查過期的時間 缺點是會浪費內存 定期刪除 每隔一段時間對一些key進行檢查并且刪除里面的過期key 有兩種模式 slow模式是定時任務,頻率是…

知識輸出零散沒有體系怎么辦

當面臨知識輸出零散、不成體系的困境時,其根本原因在于未能建立一個從輸入、整合到輸出的閉環系統。要解決這一問題,核心在于構建個人知識管理體系、掌握結構化思維與表達能力、運用合適的工具與方法進行固化、持續實踐并迭代優化。這意味著,…

【C語言選擇排序算法詳解】+ 算法性能優化 + 動態演示實現

文章目錄一、算法介紹二、算法特點三、代碼實現與解析四、代碼解析1. 打印數組函數2. 選擇排序核心邏輯3. 動態展示實現4. 主函數五、算法優化思路與實現優化1:減少交換次數優化原理:優化2:雙向選擇排序優化原理:優化3&#xff1a…

棧(Java)

提示:多練才是王道,加油?(?????)? 棧Java1. 棧2. Java中棧的其中兩種實現方式2.1 Stack類2.1.1 Stack的模擬實現2.2 LinkedList類3. 典型習題講解3.1 逆波蘭表達式求值3.2 匹配括號3.3 合理彈出序列3.4 最小棧1. 棧 棧是一種特殊的線性表,其只允許在固定的一…

LayaAir鼠標(手指)控制相機旋轉,限制角度

切換天空盒腳本掛載到相機身上 const { regClass, property } Laya;regClass() export class SmoothCameraController extends Laya.Script {declare owner: Laya.Camera;// 旋轉靈敏度property({ type: Number, name: "旋轉靈敏度" })public rotationSensitivity:…

【數據結構入門】排序算法(4)歸并排序

目錄 1.排序的原理 1.1 保證子數組有序 1.2 時間復雜度 2. 遞歸實現 2.1 思路 2.2 代碼 3. 非遞歸實現 3.1 思路 3.2 代碼 4.面試題 4.1 題目 4.2 思路 1.排序的原理 歸并排序是外排序,所謂外排序就是說能夠對文件中的數據進行排序。 ①首先&#xff…

FLEXSPI_Init 硬件故障問題

使用官方例程發現FLEXSPI_Init會引起硬件故障,查閱相關帖子發現主要有兩個可能:1、外部閃存配置差異修改 LUT(查找表)命令:示例中擦除扇區命令為 0xD7,寫狀態寄存器命令為 0x01,需分別改為 閃存…

如何用 Rust 重寫 SQLite 數據庫(一):項目探索

要使用 Rust 重寫 SQLite 數據庫,我們需要實現一個簡化的關系型數據庫核心功能(如 SQL 解析、存儲引擎、事務管理)。以下是一個分步實踐指南,包含關鍵代碼示例。一、項目規劃 我們將實現一個超簡化數據庫 MiniSQL,支持…

JVM之堆(Heap)

一、堆的核心特性 唯一性與共享性 每個JVM實例僅有一個堆,所有線程共享,但可通過線程私有緩沖區(TLAB)減少多線程分配沖突。內存結構演變 JDK 7及之前:堆分為新生代(Young)、老年代(…

單片機的RAM與ROM概念

RAM與ROM1、RAM與ROM2、 bss、data、heap、stack、text詳細講解3、詳細探討 TCM、OCRAM 和 HBNRAM 之間的區別及其具體作用。3.1、TCM(Tightly Coupled Memory)3.2、 OCRAM(On Chip RAM)3.3、HBNRAM (Hibernate RAM)3.4、總結1、R…

實驗3:事件處理(2學時)

實驗目的(1)熟練掌握 v-on 指令的用法,學會使用 v-on 指令監聽 DOM 元素的事件,并通過該事件觸發調用事件處理程序。(2)掌握v-on 指令修飾符的基本用法。實驗內容實現購物車功能的拓展(商品數量…

商品庫存扣減方案

文章目錄1. Lua腳本 Redis(業界首選,綜合最優)2. Redis原子命令(DECRBY 結果校驗)3. Redis事務(MULTI/EXEC)4. 分布式鎖(基于Redis實現)5. Redisson客戶端封裝&#xf…

關于在阿里云DMS誤操作后如何恢復數據的記錄

前言 昨天因客戶員工操作錯誤,導致快遞單號和訂單互換。客戶員工那邊讓筆記修改數據。 于是筆者寫下如下SQL來操作,導致了災難性事故。 update t_order_fed_ex_record set tracking_number 884102170661, master_tracking_number 884102170661, push…

【操作系統核心知識梳理】線程(Thread)重點與易錯點全面總結

在多任務操作系統中,線程是比進程更輕量的執行單元,理解線程的特性和實現方式是掌握并發編程的基礎。本文系統梳理了線程相關的核心知識點和常見誤區,助你夯實操作系統基礎。一、線程的基本概念與引入目的 1.1 什么是線程? 線程是…