Golang timer可能造成的內(nèi)存泄漏問題分析
Golang timer可能造成的內(nèi)存泄漏
背景
前兩天,跟一位學(xué)長(zhǎng)交流Golang;然后,他突然問我:你知道timer可能造成內(nèi)存泄漏嘛?
當(dāng)時(shí),甚是一臉懵逼,畢竟之前寫的Agent測(cè)了好久,都沒發(fā)現(xiàn)這個(gè)問題啊。
今天,就索性了解了下。
這里先說下結(jié)論:
- timer的誤用可能造成某些等待timer的Goroutine無法正常退出,導(dǎo)致資源無法釋放;
- (ps. 雖然的確算是內(nèi)存泄漏,但是對(duì)于我這種寫C出身的人來說,感覺還是怪怪的)
接下來進(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é)程也就無法繼續(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)文章
Golang并發(fā)發(fā)送HTTP請(qǐng)求的各種方法
在 Golang 領(lǐng)域,并發(fā)發(fā)送 HTTP 請(qǐng)求是優(yōu)化 Web 應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,從基本的 goroutine 到涉及通道和sync.WaitGroup 的高級(jí)技術(shù),需要的朋友可以參考下2024-02-02
go編程中g(shù)o-sql-driver的離奇bug解決記錄分析
這篇文章主要為大家介紹了go編程中g(shù)o-sql-driver的離奇bug解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Go中調(diào)用JS代碼(otto)的實(shí)現(xiàn)示例
Otto是一個(gè)用Go語言實(shí)現(xiàn)的JavaScript解釋器,可用于執(zhí)行和操作JavaScript代碼,適合在Go項(xiàng)目中執(zhí)行簡(jiǎn)單的JS腳本,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
golang如何使用gomobile進(jìn)行Android開發(fā)
golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開發(fā)的相關(guān)資料,需要的朋友可以參考下2023-01-01
golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)
這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

