亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go 內存分配管理

 更新時間:2022年02月23日 15:52:17   作者:?編程技術  
這篇文章主要介紹了Go 內存分配管理,go 語言實際內存、虛擬內存怎么分配,延遲歸還是什么機制?本文結合監(jiān)控對內存管理進行了觀測,深入學習golang對于內存的管理機制,需要的朋友可以參考一下

一、問題引入

現象:在實際工作項目中,golang項目經常內存報警,現象為在流量增大,或傳入很大文件的情況下算法worker內存降低到一定限度之后(100Mb左右),過一段時間才能內存才能自動恢復。

  • Go內存管理機制,Go自己本身會管理內存,釋放的內存不會立即歸還給操作系統,在一定時間之后才會歸還給操作系統,過早的釋放內存歸還給操作系統會降低性能。
  • 內存泄漏,Go調用CGO算法模塊時,導致了內存泄漏
  • 進程占用的內存過大導致進程掛掉,并釋放了內存,supervisor自動重啟了進程,內存曲線恢復正常

二、幾個基本概念

1.RSS,VSS解釋

對于RAM內存的使用,實際是os kernel來控制的。

  • RSS(Resident Set Size)表示該進程分配的占用RAM的內存大小,不包括交互分區(qū)內存,包括共享庫占用的內存,棧內存,堆內存
  • VSZ(Virtual Memory Size)表示該進程分配的虛擬內存大小,包括進程可以訪問的所有內存,包括交換分區(qū),共享內存

舉例說明RSS,VSS:

如果一個進程,程序的大小有 500K,鏈接的共享庫大小有 2500K,堆棧內存共有 200K,其中 100K 進入了交換分區(qū)。進程實際加載了共享庫中的 1000K 的內容,以及自己程序的中的 400K 的內容。請問 RSS 和 VSZ 應是多少?RSS: 400K + 1000K + 100K = 1500K VSZ: 500K + 2500K + 200K = 3200K

三、Go內存管理機制

1.Go runtime內存延遲歸還

Go是一種高級語言,自帶GC。內存的分配和回收都是自動的被垃圾回收器所執(zhí)行,當某個對象內存變成不可達狀態(tài)時(unreachable)。垃圾回收器則將其回收。

Go中空閑的內存,并不意味著立即歸還給操作系統。空閑的內存可以被重新利用。因此Go語言中,即使某些對象被釋放了,操作系統的內存使用并沒有下降。這是因為Go的內存管理器,將其標為free,并可以重新利用。

Go runtime不會立刻歸還內存給操作系統,內存在大約5分鐘左右沒有被使用時,才會歸還給操作系統。

例如:在處理Http請求時讀取HttpBodyBytes.Buffer中,處理完HttpBody的內容之后,并不會立刻釋放內存給OS,而是將這些內存對下一個Http請求進行內存的復用。

編寫如下:簡單的http服務,并使用ab進行壓測可以驗證Go gc的延遲歸還內存給操作系統:

func main() { ?
? ? http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { ?
? ? ? ? fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) ?
? ? }) ?

? ? http.ListenAndServe(":8010", nil) ?

? ? fmt.Println("hello") ?
} ?

初始:

$ ps -p 563 -v ?
? PID TTY ? ? ?STAT ? TIME ?MAJFL ? TRS ? DRS ? RSS %MEM COMMAND ?
? 563 pts/19 ? SNl ? ?0:27 ? ? ?0 ?2100 359203 ?3480 ?0.1 ./http ?

壓測后:

ab -n 1000000 -c 1000 http://10.104.7.46:8010/bar
$ ps -p 563 -v ?
? PID TTY ? ? ?STAT ? TIME ?MAJFL ? TRS ? DRS ? RSS %MEM COMMAND ?
? 563 pts/19 ? SNl ? ?0:27 ? ? ?0 ?2100 359203 12908 ?0.1 ./http ?

 5min后:

$ ps -p 563 -v ?
? PID TTY ? ? ?STAT ? TIME ?MAJFL ? TRS ? DRS ? RSS %MEM COMMAND ?
? 563 pts/19 ? SNl ? ?0:27 ? ? ?0 ?2100 359203 4816 ?0.0 ./http ?

可以看到RSS由3480到12908在到4816,結合free -m可以看到內存一樣的變化,因此驗證了golang的內存管理的延遲歸還特性。

2.強制歸還內存

debug.FreeOSMemory()

該函數強制盡可能多的將內存歸還給操作系統。不推薦手動調用釋放內存,

FreeOSMemory

的操作在后臺進程runtime來負責執(zhí)行,定期歸還內存給操作系統。

到此這篇關于Go 內存分配管理的文章就介紹到這了,更多相關Go 內存管理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang?HTTP服務超時控制實現原理分析

    Golang?HTTP服務超時控制實現原理分析

    這篇文章主要介紹了Golang?HTTP服務超時控制實現原理,HTTP服務的超時控制是保障服務高可用性的重要措施之一,由于HTTP服務可能會遇到網絡延遲,資源瓶頸等問題,因此需要對請求進行超時控制,以避免服務雪崩等問題,需要的朋友可以參考下
    2023-05-05
  • Go一站式配置管理工具Viper的使用教程

    Go一站式配置管理工具Viper的使用教程

    Viper是一個方便Go語言應用程序處理配置信息的庫,它可以處理多種格式的配置,這篇文章主要為大家介紹了它的具體使用教程,需要的可以參考下
    2023-08-08
  • GO語言中embed簡介

    GO語言中embed簡介

    這篇文章主要介紹了GO語言中embed簡介的相關資料,需要的朋友可以參考下
    2023-08-08
  • go語言實現簡單http服務的方法

    go語言實現簡單http服務的方法

    這篇文章主要介紹了go語言實現簡單http服務的方法,涉及Go語言http操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go中的nil切片和空切片區(qū)別詳解

    Go中的nil切片和空切片區(qū)別詳解

    這篇文章主要介紹了Go中的nil切片和空切片區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • go語言的panic和recover函數用法實例

    go語言的panic和recover函數用法實例

    今天小編就為大家分享一篇關于go語言的panic和recover函數用法實例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go內置序列化庫gob的使用

    Go內置序列化庫gob的使用

    本文主要介紹了Go內置序列化庫gob的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Go interface接口聲明實現及作用詳解

    Go interface接口聲明實現及作用詳解

    這篇文章主要為大家介紹了Go interface接口聲明實現及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Golang打包go項目部署到linux服務器正確方法

    Golang打包go項目部署到linux服務器正確方法

    這篇文章主要給大家介紹了關于Golang打包go項目部署到linux服務器的正確方法,Go?是一個開源的編程語言,它能讓構造簡單、可靠且高效的軟件變得容易,具有簡潔、快速、安全,并行、有趣、開源,內存管理、v數組安全、編譯迅速的特征,需要的朋友可以參考下
    2023-10-10
  • Go 基于令牌桶的限流器實現

    Go 基于令牌桶的限流器實現

    如果一般流量過大,下游系統反應不過來,這個時候就需要限流了,本文主要介紹了Go 基于令牌桶的限流器實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論