欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GoLang內(nèi)存泄漏原因排查詳解

 更新時(shí)間:2022年12月15日 16:38:06   作者:上后左愛(ài)  
內(nèi)存溢出是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用,簡(jiǎn)單點(diǎn)說(shuō)就是你要求分配的內(nèi)存超出了系統(tǒng)能給你的,系統(tǒng)不能滿足需求,于是產(chǎn)生溢出出現(xiàn)out of memory異常

背景

Go 語(yǔ)言中有對(duì)應(yīng)的Go 內(nèi)存回收機(jī)制,在Go采用 并發(fā)三色標(biāo)記清除  算法, 但是由于實(shí)際的過(guò)程中 發(fā)現(xiàn)會(huì)有一些內(nèi)存泄漏的常見(jiàn),內(nèi)存泄漏 分為: 臨時(shí)性 和 永久性內(nèi)存泄漏。

初步排查過(guò)程中: 發(fā)現(xiàn)Linux使用top 發(fā)現(xiàn)內(nèi)存隨著時(shí)間會(huì)持續(xù)的增加沒(méi)有穩(wěn)定在一個(gè)合理值中。

在使用 pprof ,BBC 等 Go的內(nèi)存泄漏工具進(jìn)行排查

臨時(shí)性內(nèi)存泄漏

指的釋放內(nèi)存 不及時(shí),對(duì)應(yīng)的內(nèi)存在更晚時(shí)候釋放,這類問(wèn)題主要是 string,slice 和底層的Buffer 錯(cuò)誤共享,或者defer 函數(shù)資源沒(méi)有及時(shí)的釋放。

數(shù)組不正常使用導(dǎo)致內(nèi)存泄漏

數(shù)組作為形參 遵守的是 值拷貝,如果函數(shù)調(diào)用次數(shù)很多并且數(shù)組過(guò)大,導(dǎo)致 內(nèi)存使用激增

func countTragetBigNum(nums [1000000]int, target int) int {
   num := 0
   for i :=0; i< len(nums) && nums[i] ==target ; i++ {
   	num += 1
   }
   return num
}
# 在短時(shí)間內(nèi) 創(chuàng)建100萬(wàn)數(shù)組 內(nèi)存是8M,短時(shí)間內(nèi)調(diào)用 100 次,并且作為是形參 在Go進(jìn)行是 值Copy ,800M, 所以在時(shí)間過(guò)程中:

大數(shù)組在形參的場(chǎng)景下,通常使用的是切片方式?;蛘呤褂弥羔樳M(jìn)行傳遞,避免在短時(shí)間內(nèi)內(nèi)存激增

goroutine 沒(méi)有及時(shí)釋放

一個(gè) goroutine 創(chuàng)建 2KB

1. 互斥鎖沒(méi)有釋放
func mutexTest() {
	mutex := sync.Mutex{}
	for i := 0; i < 10; i++ {
		go func () {
			mutex.Lock()
			fmt.Printf("%d goroutine get mutex", i)
			time.Sleep(100 * time.Microsecond)
		}()
	}
}
2. 死鎖情形
3. 空channel --聲明空channel但是沒(méi)有初始化 導(dǎo)致讀寫(xiě)被阻塞
func channelTest(){
	// 聲明空 channel且不初始化導(dǎo)致阻塞
	var c chan int
	// 向通道中寫(xiě)數(shù)據(jù)
	go func() {
		c <- 1
		fmt.Printf("g1 send message")
	}()
	// 從通道中讀數(shù)據(jù)
	go func(){
		<- c
		fmt.Printf("g2 receive message")
	}()
}
4. 能進(jìn)不能出, 能出不能進(jìn) (寫(xiě)和讀 通道量不一致)
導(dǎo)致大量的協(xié)程被阻塞
func channelTest() {
	// 聲明空 channel且不初始化導(dǎo)致阻塞
	var c chan int
	// 10 個(gè)向通道中寫(xiě)數(shù)據(jù),導(dǎo)致 寫(xiě)大于讀量
	// 10個(gè)通道讀數(shù)據(jù),1個(gè)通道寫(xiě)數(shù)據(jù)也是一樣的
	for i := 0; i < 10; i++ {
		go func() {
			c <- i
			fmt.Printf("g1 send message")
		}()
	}
	// 從通道中讀數(shù)據(jù)
	go func() {
		<-c
		fmt.Printf("g2 receive message")
	}()
}
5. Time 定時(shí)器使用 定時(shí)器沒(méi)有 手動(dòng)Stop 會(huì)一直占有內(nèi)存
func tickerTest() {
	ticker := time.NewTicker(time.Second * 20)
	go func() {
		for t := range ticker.C {
			fmt.Printf("ticker trigger")
		}
	}()
	time.Sleep(time.Second * 20)
	ticker.Stop()
}

通道理解

通道 channel 屬于Go語(yǔ)言中首次提出的 運(yùn)用 goroutine 的進(jìn)行數(shù)據(jù)交換的 容器;

  • 緩沖通道屬于一個(gè)元素隊(duì)列, 有先入先出原則, 屬于線程安全
  • 如果通道滿了, 發(fā)送goroutine 會(huì)阻塞直到 read goroutine 進(jìn)行接收操作
  • 如果通道是空的, 執(zhí)行接收goroutine 阻塞直到 write goroutine 在通道上發(fā)送數(shù)據(jù);
  • 通道既不滿也不空,所以通道的緩沖區(qū)將發(fā)送和接收 goroutine 進(jìn)行解耦操作

如果程序直到 緩沖區(qū)的容量, 可以調(diào)用 內(nèi)置的  cap函數(shù) cap(ch) -- 緩沖區(qū)容量
len(ch) -- 緩沖區(qū)內(nèi) 元素個(gè)數(shù)

goroutine 泄漏: 使用一個(gè)無(wú)緩沖通道,兩個(gè)慢的 goroutine 卡住,發(fā)送的響應(yīng)的結(jié)果沒(méi)有其他的goroutine 接收 這個(gè)情況屬于 goroutine 泄漏;

如果讀速度比較快,緩沖區(qū)存是沒(méi)有意義的

到此這篇關(guān)于GoLang內(nèi)存泄漏原因排查詳解的文章就介紹到這了,更多相關(guān)Go內(nèi)存泄漏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go處理PDF的實(shí)現(xiàn)代碼

    Go處理PDF的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Go處理PDF的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開(kāi)發(fā)

    掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開(kāi)發(fā)

    這篇文章主要為大家介紹了GoLang Fiber路由和中間件進(jìn)行高效Web開(kāi)發(fā),本文將深入探討 Fiber 中的路由細(xì)節(jié),學(xué)習(xí)如何創(chuàng)建和處理路由,深入了解使用路由參數(shù)的動(dòng)態(tài)路由,并掌握在 Fiber 應(yīng)用程序中實(shí)現(xiàn)中間件的藝術(shù)
    2024-01-01
  • golang數(shù)組-----尋找數(shù)組中缺失的整數(shù)方法

    golang數(shù)組-----尋找數(shù)組中缺失的整數(shù)方法

    這篇文章主要介紹了golang數(shù)組-----尋找數(shù)組中缺失的整數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang中文字符串截取函數(shù)實(shí)現(xiàn)原理

    Golang中文字符串截取函數(shù)實(shí)現(xiàn)原理

    在golang中可以通過(guò)切片截取一個(gè)數(shù)組或字符串,但是當(dāng)截取的字符串是中文時(shí),可能會(huì)出現(xiàn)問(wèn)題,下面我們來(lái)自定義個(gè)函數(shù)解決Golang中文字符串截取問(wèn)題
    2018-03-03
  • 解決golang sync.Wait()不執(zhí)行的問(wèn)題

    解決golang sync.Wait()不執(zhí)行的問(wèn)題

    這篇文章主要介紹了解決golang sync.Wait()不執(zhí)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • go語(yǔ)言實(shí)現(xiàn)十大常見(jiàn)的排序算法示例

    go語(yǔ)言實(shí)現(xiàn)十大常見(jiàn)的排序算法示例

    這篇文章主要為大家介紹了go語(yǔ)言實(shí)現(xiàn)十大常見(jiàn)的排序算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 一個(gè)簡(jiǎn)單的Golang實(shí)現(xiàn)的HTTP Proxy方法

    一個(gè)簡(jiǎn)單的Golang實(shí)現(xiàn)的HTTP Proxy方法

    今天小編就為大家分享一篇一個(gè)簡(jiǎn)單的Golang實(shí)現(xiàn)的HTTP Proxy方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Golang 錯(cuò)誤捕獲Panic與Recover的使用

    Golang 錯(cuò)誤捕獲Panic與Recover的使用

    對(duì)于Go語(yǔ)言的錯(cuò)誤是通過(guò)返回值的方式,本文主要介紹了Golang 錯(cuò)誤捕獲Panic與Recover的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄

    goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄

    golang編譯的應(yīng)用是不需要依賴其他運(yùn)行環(huán)境的,下面這篇文章主要給大家介紹了關(guān)于goland把go項(xiàng)目打包進(jìn)docker鏡像的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Go routine使用方法講解

    Go routine使用方法講解

    goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò)go關(guān)鍵字來(lái)開(kāi)啟goroutine即可。這篇文章主要介紹了GoLang并發(fā)機(jī)制goroutine原理,感興趣的可以了解一下
    2023-01-01

最新評(píng)論