Go GC 動(dòng)作是需要所有正在運(yùn)行 `goroutine` 都停止后進(jìn)行的嗎?
golang 的 GC 動(dòng)作是需要所有正在運(yùn)行 `goroutine` 都停止后進(jìn)行的嗎
是的,Go語(yǔ)言的垃圾回收器需要所有的goroutine都停止才能進(jìn)行垃圾回收。這是為了確保回收器不會(huì)在回收對(duì)象時(shí)與正在使用它們的goroutine發(fā)生沖突。因此,在進(jìn)行垃圾回收時(shí),Go程序會(huì)停止所有正在運(yùn)行的goroutine,并在垃圾回收完成后恢復(fù)它們的運(yùn)行。
那么為什么我單核處理器 子goroutine在執(zhí)行中,但是GC還是執(zhí)行完了呢
在Go語(yǔ)言中,垃圾回收器是通過(guò)并發(fā)標(biāo)記和并發(fā)清除的方式來(lái)進(jìn)行垃圾回收的。在標(biāo)記階段,垃圾回收器會(huì)遍歷整個(gè)堆,標(biāo)記所有存活的對(duì)象。這個(gè)過(guò)程是并發(fā)執(zhí)行的,可以與正在運(yùn)行的goroutine同時(shí)進(jìn)行。在清除階段,垃圾回收器會(huì)清除所有未被標(biāo)記的對(duì)象。這個(gè)過(guò)程也是并發(fā)執(zhí)行的,可以與正在運(yùn)行的goroutine同時(shí)進(jìn)行。
因此,即使有一些goroutine正在運(yùn)行,垃圾回收器也可以在并發(fā)執(zhí)行的情況下完成垃圾回收。但是,在某些情況下,如果垃圾回收器需要等待某些goroutine完成才能繼續(xù)執(zhí)行,它可能會(huì)暫停這些goroutine,并在垃圾回收完成后恢復(fù)它們的運(yùn)行。
golang中 runtime.Gosched()函數(shù)作用
runtime.Gosched()
函數(shù)是Go語(yǔ)言中的一個(gè)函數(shù),它的作用是讓出當(dāng)前goroutine的執(zhí)行權(quán)限,讓其他goroutine有機(jī)會(huì)運(yùn)行。當(dāng)調(diào)用runtime.Gosched()
函數(shù)時(shí),當(dāng)前goroutine會(huì)被暫停,然后被放回到等待運(yùn)行的隊(duì)列中,等待調(diào)度器重新安排它的運(yùn)行。
這個(gè)函數(shù)通常用于幫助避免goroutine的饑餓狀態(tài),即某些goroutine一直占用CPU資源,導(dǎo)致其他goroutine無(wú)法運(yùn)行。通過(guò)在適當(dāng)?shù)臅r(shí)候調(diào)用runtime.Gosched()
函數(shù),可以讓其他goroutine有機(jī)會(huì)運(yùn)行,并避免出現(xiàn)饑餓狀態(tài)。
需要注意的是,runtime.Gosched()
函數(shù)只是讓出當(dāng)前goroutine的執(zhí)行權(quán)限,并不能保證其他goroutine會(huì)立即運(yùn)行。調(diào)度器會(huì)根據(jù)一定的策略來(lái)安排goroutine的運(yùn)行,因此在某些情況下,其他goroutine可能仍然無(wú)法運(yùn)行。