Golang timer可能造成的內(nèi)存泄漏問(wèn)題分析
Golang timer可能造成的內(nèi)存泄漏
背景
前兩天,跟一位學(xué)長(zhǎng)交流Golang;然后,他突然問(wèn)我:你知道timer可能造成內(nèi)存泄漏嘛?
當(dāng)時(shí),甚是一臉懵逼,畢竟之前寫的Agent測(cè)了好久,都沒發(fā)現(xiàn)這個(gè)問(wèn)題啊。
今天,就索性了解了下。
這里先說(shuō)下結(jié)論:
- timer的誤用可能造成某些等待timer的Goroutine無(wú)法正常退出,導(dǎo)致資源無(wú)法釋放;
- (ps. 雖然的確算是內(nèi)存泄漏,但是對(duì)于我這種寫C出身的人來(lái)說(shuō),感覺還是怪怪的)
接下來(lái)進(jìn)入正題
讓我們先看一段代碼;
這段代碼的意圖是,協(xié)程在timer.Stop()調(diào)用后能夠繼續(xù)執(zhí)行從而退出;
但是,實(shí)際的效果呢? 我們沒有看到任何輸出提示;
那是為什么呢?
這當(dāng)中核心的原因就是,timer.Stop() 這個(gè)接口從設(shè)計(jì)的時(shí)候就設(shè)計(jì)成了并不去關(guān)閉Channel;
既然不關(guān)閉Chan,那么本例中的協(xié)程也就無(wú)法繼續(xù)執(zhí)行,從而退出了;
package main import ( "time" "fmt" ) func main() { timer := time.NewTimer(3 * time.Second) go func() { <-timer.C fmt.Println("Timer has expired.") }() timer.Stop() time.Sleep(60 * time.Second) }
作為一種修復(fù)手段:
package main import ( "time" "fmt" ) func main() { timer := time.NewTimer(3 * time.Second) go func() { <-timer.C fmt.Println("Timer has expired.") }() //timer.Stop() timer.Reset(0 * time.Second) time.Sleep(60 * time.Second) }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解
這篇文章主要為大家介紹了Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06golang實(shí)現(xiàn)命令行程序的使用幫助功能
這篇文章介紹了golang實(shí)現(xiàn)命令行程序使用幫助的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Go語(yǔ)言實(shí)現(xiàn)ssh&scp的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)ssh&scp,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2022-10-10Golang 模塊引入及表格讀寫業(yè)務(wù)快速實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Golang模塊引入及表格讀寫業(yè)務(wù)的快速實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法
需要在Go寫的服務(wù)里面調(diào)用命令行或者批處理,并根據(jù)返回的結(jié)果做處理。但是windows下面用cmd返回中文會(huì)出現(xiàn)亂碼,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-12-12