您好,登錄后才能下訂單哦!
這篇文章主要為大家分析了Go中內存釋放的改進是怎樣的的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“Go中內存釋放的改進是怎樣的”的知識吧。
一直以來 go 的 runtime 在釋放內存返回到內核時,在 Linux 上使用的是 MADV_DONTNEED
,雖然效率比較低,但是會讓 RSS(resident set size 常駐內存集)數量下降得很快。不過在 go 1.12 里專門針對這個做了優化,runtime 在釋放內存時,使用了更加高效的 MADV_FREE
而不是之前的 MADV_DONTNEED
。
這樣帶來的好處是,一次 GC 后的內存分配延遲得以改善,runtime 也會更加積極地將釋放的內存歸還給操作系統,以應對大塊內存分配無法重用已存在的堆空間的問題。不過也會帶來一個副作用:RSS 不會立刻下降,而是要等到系統有內存壓力了,才會延遲下降。需要注意的是, MADV_FREE
需要 4.5 以及以上內核,否則 runtime 會繼續使用原先的 MADV_DONTNEED
方式。
比如,我最近就遇到了這個問題:
幾臺服務的請求量差別并不大,可以明顯看到 25(4.14 內核,其他幾臺都是 3.10 內核)的內存釋放看起來很慢,但是 HEAP 占用顯示卻正常:
順便說下,4.1 以上內核,最為引人注目的特性就是 eBPF,通過一個內核內置的字節碼虛擬機,可以完成數據包過濾、調用棧跟蹤、耗時統計、熱點分析等等高級功能,是 Linux 系統的性能分析利器。
當然 go 1.12 為了避免像這樣一些靠判斷 RSS 大小的自動化測試因此出問題,也提供了一個 GODEBUG=madvdontneed=1
參數可以強制 runtime 繼續使用 MADV_DONTNEED
:runtime: provide way to disable MADV_FREE。但是顯然正常情況下,我們都應該優先使用 MADV_FREE
。
go是golang的簡稱,而golang可以做服務器端開發,且golang很適合做日志處理、數據打包、虛擬機處理、數據庫代理等工作。在網絡編程方面,它還廣泛應用于web應用、API應用等領域。
關于“Go中內存釋放的改進是怎樣的”就介紹到這了,更多相關內容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請多多支持億速云網站!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。