最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

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

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

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

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

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

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

數(shù)組作為形參 遵守的是 值拷貝,如果函數(shù)調(diào)用次數(shù)很多并且數(shù)組過大,導(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
}
# 在短時間內(nèi) 創(chuàng)建100萬數(shù)組 內(nèi)存是8M,短時間內(nèi)調(diào)用 100 次,并且作為是形參 在Go進行是 值Copy ,800M, 所以在時間過程中:

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

goroutine 沒有及時釋放

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

1. 互斥鎖沒有釋放
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但是沒有初始化 導(dǎo)致讀寫被阻塞
func channelTest(){
	// 聲明空 channel且不初始化導(dǎo)致阻塞
	var c chan int
	// 向通道中寫數(shù)據(jù)
	go func() {
		c <- 1
		fmt.Printf("g1 send message")
	}()
	// 從通道中讀數(shù)據(jù)
	go func(){
		<- c
		fmt.Printf("g2 receive message")
	}()
}
4. 能進不能出, 能出不能進 (寫和讀 通道量不一致)
導(dǎo)致大量的協(xié)程被阻塞
func channelTest() {
	// 聲明空 channel且不初始化導(dǎo)致阻塞
	var c chan int
	// 10 個向通道中寫數(shù)據(jù),導(dǎo)致 寫大于讀量
	// 10個通道讀數(shù)據(jù),1個通道寫數(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 定時器使用 定時器沒有 手動Stop 會一直占有內(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語言中首次提出的 運用 goroutine 的進行數(shù)據(jù)交換的 容器;

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

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

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

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

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

相關(guān)文章

  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • 淺談golang slice 切片原理

    淺談golang slice 切片原理

    這篇文章主要介紹了淺談golang slice 切片原理,詳細的介紹了golang slice 切片的概念和原理,具有一定的參考價值,有興趣的可以了解一下
    2017-11-11
  • Go如何實現(xiàn)Websocket服務(wù)以及代理

    Go如何實現(xiàn)Websocket服務(wù)以及代理

    這篇文章主要介紹了Go如何實現(xiàn)Websocket服務(wù)以及代理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Golang內(nèi)存泄露場景與定位方式的實現(xiàn)

    Golang內(nèi)存泄露場景與定位方式的實現(xiàn)

    Golang有自動垃圾回收機制,但是仍然可能會出現(xiàn)內(nèi)存泄漏的情況,本文主要介紹了Golang內(nèi)存泄露場景與定位方式的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Go語言實戰(zhàn)之詳細掌握正則表達式的應(yīng)用與技巧

    Go語言實戰(zhàn)之詳細掌握正則表達式的應(yīng)用與技巧

    正則表達式是一種從左到右與主題字符串匹配的模式,正則表達式用于替換字符串中的文本,驗證表單,基于模式匹配從字符串中提取子字符串等等,這篇文章主要給大家介紹了關(guān)于Go語言實戰(zhàn)之詳細掌握正則表達式的應(yīng)用與技巧,需要的朋友可以參考下
    2023-12-12
  • 詳解如何熱重啟golang服務(wù)器

    詳解如何熱重啟golang服務(wù)器

    這篇文章主要介紹了詳解如何熱重啟golang服務(wù)器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)

    GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)

    本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門

    golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門

    這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Golang性能提升利器之SectionReader的用法詳解

    Golang性能提升利器之SectionReader的用法詳解

    本文將介紹 Go 語言中的 SectionReader,包括 SectionReader的基本使用方法、實現(xiàn)原理、使用注意事項,感興趣的小伙伴可以了解一下
    2023-07-07
  • Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    這篇文章主要介紹了Linux系統(tǒng)下Go開發(fā)環(huán)境搭建,需要的朋友可以參考下
    2022-04-04

最新評論

正定县| 新乐市| 桓台县| 会泽县| 余姚市| 罗山县| 商城县| 安仁县| 城固县| 绥宁县| 淳安县| 虹口区| 平湖市| 景谷| 博客| 紫阳县| 治县。| 鄂托克前旗| 安远县| 巨鹿县| 阿荣旗| 仁寿县| 巴林左旗| 康马县| 永泰县| 瑞丽市| 勃利县| 治多县| 隆安县| 木兰县| 横峰县| 博湖县| 潜江市| 福泉市| 湾仔区| 平塘县| 大方县| 衡山县| 游戏| 顺义区| 新巴尔虎左旗|