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

Golang處理內(nèi)存溢出方式

 更新時(shí)間:2024年12月20日 10:08:33   作者:dkjhl  
本文介紹了Golang中分析內(nèi)存溢出問(wèn)題的三種工具:pprof、GoMemstats和程序crash時(shí)自動(dòng)創(chuàng)建dump文件,通過(guò)這些工具,可以對(duì)程序的內(nèi)存使用情況進(jìn)行詳細(xì)分析,從而找出內(nèi)存溢出的原因

背景

最近系統(tǒng)在壓測(cè)過(guò)程中發(fā)現(xiàn)主程序在并發(fā)增大后會(huì)出現(xiàn)主程序閃退現(xiàn)象,幾經(jīng)波折,認(rèn)為有可能是內(nèi)存溢出引起的

正好對(duì) Golang 里分析 dump 這塊還沒(méi)怎么涉及,借此契機(jī)研究一下。

前言

查看社區(qū)后,發(fā)現(xiàn)在Golang中,發(fā)生內(nèi)存溢出通常會(huì)導(dǎo)致程序直接崩潰退出,而無(wú)法像其他語(yǔ)言一樣生成core dump文件。

因此,Golang社區(qū)提供了一些工具可以幫助用戶進(jìn)行內(nèi)存分析。

以下是兩個(gè)常用的工具:

1. pprof

pprof是Golang內(nèi)置的性能分析工具,在分析內(nèi)存使用方面非常有用。

通過(guò)設(shè)置一個(gè)標(biāo)志位并在程序退出時(shí)打開pprof服務(wù)器,程序可以向pprof服務(wù)器報(bào)告一些性能數(shù)據(jù),例如內(nèi)存使用情況。

可以在代碼中加入以下代碼,啟動(dòng)pprof服務(wù)器并在本地8080端口進(jìn)行訪問(wèn):

import "net/http"
import _ "net/http/pprof"

func main() {
    go func() {
        http.ListenAndServe("localhost:8080", nil)
    }()
    // ...
}

啟動(dòng)pprof服務(wù)器之后,可以訪問(wèn)http://localhost:8080/debug/pprof/heap進(jìn)行堆內(nèi)存分析,獲取內(nèi)存占用的堆快照。

上圖中框出的這 4 個(gè)部分應(yīng)該是平時(shí)最常用的,從上往下分別是:

  • 阻塞分析: 比如,goroutine 的 wait。
  • 內(nèi)存分析: 比如,內(nèi)存泄漏、內(nèi)存消耗異常等情況。
  • 互斥鎖分析: 比如,觀察代碼里用到的sync.RWMutex 和 sync.Mutex 的具體情況。
  • CPU 分析: 比如,排查哪些代碼較多地占用了 CPU 資源。

以下是一段消耗內(nèi)存的代碼,用于走讀流程,如下:

func main() {
	go func() { http.ListenAndServe("0.0.0.0:8899", nil) }()
	str := "gejigejigejigejigejigejigejigjeijgiewjiasdiahdkuhakudsfhakdshgkjasdkjgbakjsdfioajewoiepqbibgijqbgoipbjwebkjfqjkw egqhwejbgfaijwebgjqhb"
	for i := 0; i < 999; i++ {
		str += str
	}
	fmt.Scanln()
}

在 web 頁(yè)面點(diǎn)擊「heap」入口,我們可以看到實(shí)時(shí)內(nèi)存的使用情況。

再通過(guò)以下命令進(jìn)入到命令交互模式看看效果:

go tool pprof http://localhost:8899/debug/pprof/heap

進(jìn)去之后輸入「top」,就能很直觀的看到哪個(gè)方法占用了內(nèi)存。

這里的幾個(gè)列的含義簡(jiǎn)單羅列下:

  • flat:當(dāng)前函數(shù)所占用的容量。
  • flat%:當(dāng)前函數(shù)所占用的容量,在總分配容量的百分比。
  • sum%:是從調(diào)用的最外層到當(dāng)前方法累加使用的容量占總?cè)萘康陌俜直?/li>
  • cum:當(dāng)前函數(shù)以及子函數(shù)所占用的容量。
  • cum%:當(dāng)前函數(shù)以及子函數(shù)所占用的容量,在總分配容量的百分比。
  • 最后一列是函數(shù)的名字

可以再輸入獲得更詳細(xì)的信息:

list main.main

上述指令會(huì)羅列出每行代碼占用的容量;其他類似,如下是分析CPU的

2. Go Memstats

Go Memstats是一個(gè)Golang的標(biāo)準(zhǔn)庫(kù)工具,用于收集和顯示內(nèi)存信息。

可以在代碼中導(dǎo)入“runtime”包,并調(diào)用“runtime.ReadMemStats(&mem)”函數(shù)收集內(nèi)存信息。

然后可以打印內(nèi)存使用情況的詳情,例如總分配量和分配的堆塊數(shù)量等。

以下是示例代碼:

import (
    "fmt"
    "runtime"
)

func main() {
    var mem runtime.MemStats
    runtime.ReadMemStats(&mem)
    fmt.Printf("TotalAlloc (Heap) = %v MiB\n", mem.TotalAlloc/mb)
    fmt.Printf("Alloc = %v MiB\n", mem.Alloc/mb)
    fmt.Printf("Sys = %v MiB\n", mem.Sys/mb)
    fmt.Printf("NumGC = %v\n", mem.NumGC)
}

這將輸出程序中已分配的總內(nèi)存,已使用的內(nèi)存量,系統(tǒng)內(nèi)存使用情況和垃圾回收次數(shù)等信息。

使用這些信息,可以分析內(nèi)存占用量的增長(zhǎng)和優(yōu)化內(nèi)存使用。

3. 程序 crash 的時(shí)候自動(dòng)創(chuàng)建 dump 文件

大多數(shù)時(shí)候,我們可能沒(méi)有條件實(shí)時(shí)分析程序運(yùn)行情況。

比如問(wèn)題在生產(chǎn)環(huán)境偶發(fā)出現(xiàn),且無(wú)法在測(cè)試環(huán)境重現(xiàn)。

這個(gè)時(shí)候我們可以配置當(dāng)程序 crash 的時(shí)候自動(dòng)保存 dump 文件。

先輸入命令「ulimit -a」看下當(dāng)前是否開啟了core file。

這里的數(shù)字單位是 block,具體需要根據(jù)所在的操作系統(tǒng)一個(gè) block 對(duì)應(yīng)的大小來(lái)設(shè)置。如果是0的話說(shuō)明未開啟??梢酝ㄟ^(guò):

ulimit -c 1024 或者 ulimit -c unlimited 來(lái)設(shè)置 dump 文件的最大 size。

如果想要永久有效,則:

echo "ulimit -c unlimited" >> ~/.profile

讓程序發(fā)生 crash 的時(shí)候會(huì)自動(dòng)生成 dump 文件

## 臨時(shí)有效
export GOBACTRACE=crash

## 永久有效
echo "export GOTRACEBACK=crash " >> ~/.profile

這就意味著,讓程序發(fā)生 crash 的時(shí)候會(huì)自動(dòng)生成 dump 文件。

有了 dump 文件,可以用 gdb 或者 delve 工具來(lái)分析了(官方更建議我們使用 delve,對(duì) Golang 的支持更好)

總之啊,無(wú)論你使用哪種工具,分析Golang內(nèi)存溢出問(wèn)題需要耐心和技巧。

建議不僅可以使用這些工具進(jìn)行數(shù)據(jù)分析,同時(shí)還應(yīng)該閱讀關(guān)于垃圾回收機(jī)制和內(nèi)存管理的文檔,嘗試實(shí)現(xiàn)更好的編碼習(xí)慣,以減少內(nèi)存溢出的可能性。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • golang中iota的用法小結(jié)

    golang中iota的用法小結(jié)

    iota是Go語(yǔ)言中的一個(gè)預(yù)定義標(biāo)識(shí)符,用于表示const聲明塊中每個(gè)常量的偏移值,本文主要介紹了golang中iota的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • goLang引入自定義包的方法

    goLang引入自定義包的方法

    今天小編就為大家分享一篇goLang引入自定義包的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 淺談GoLang幾種讀文件方式的比較

    淺談GoLang幾種讀文件方式的比較

    這篇文章主要介紹了淺談GoLang幾種讀文件方式的比較,一般來(lái)說(shuō)常用的有三種。使用Read加上buffer,使用bufio庫(kù)和ioutil 庫(kù),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01
  • go語(yǔ)言的變量定義示例詳解

    go語(yǔ)言的變量定義示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言的變量定義示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • golang bufio包中Write方法的深入講解

    golang bufio包中Write方法的深入講解

    這篇文章主要給大家介紹了關(guān)于golang bufio包中Write方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 利用go-kit組件進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn)和健康檢查的操作

    利用go-kit組件進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn)和健康檢查的操作

    這篇文章主要介紹了利用go-kit組件進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn)和健康檢查的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang實(shí)現(xiàn)http server提供壓縮文件下載功能

    Golang實(shí)現(xiàn)http server提供壓縮文件下載功能

    這篇文章主要介紹了Golang實(shí)現(xiàn)http server提供壓縮文件下載功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作

    xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作

    這篇文章主要介紹了xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言中工作池的原理與實(shí)現(xiàn)

    Go語(yǔ)言中工作池的原理與實(shí)現(xiàn)

    工作池是一種并發(fā)編程模式,它使用一組固定數(shù)量的工作線程來(lái)執(zhí)行任務(wù)隊(duì)列中的工作單元,本文將介紹工作池的工作原理,并通過(guò)代碼示例演示其在實(shí)際應(yīng)用中的用途,有需要的可以參考下
    2023-10-10
  • golang中sync.Map并發(fā)創(chuàng)建、讀取問(wèn)題實(shí)戰(zhàn)記錄

    golang中sync.Map并發(fā)創(chuàng)建、讀取問(wèn)題實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于golang中sync.Map并發(fā)創(chuàng)建、讀取問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論