欢迎光临散文网 会员登陆 & 注册

Go GC 动作是需要所有正在运行 `goroutine` 都停止后进行的吗?

2023-06-15 22:14 作者:误入歧途的先森  | 我要投稿

golang 的 GC 动作是需要所有正在运行 `goroutine` 都停止后进行的吗

是的,Go语言的垃圾回收器需要所有的goroutine都停止才能进行垃圾回收。这是为了确保回收器不会在回收对象时与正在使用它们的goroutine发生冲突。因此,在进行垃圾回收时,Go程序会停止所有正在运行的goroutine,并在垃圾回收完成后恢复它们的运行。

那么为什么我单核处理器 子goroutine在执行中,但是GC还是执行完了呢

在Go语言中,垃圾回收器是通过并发标记和并发清除的方式来进行垃圾回收的。在标记阶段,垃圾回收器会遍历整个堆,标记所有存活的对象。这个过程是并发执行的,可以与正在运行的goroutine同时进行。在清除阶段,垃圾回收器会清除所有未被标记的对象。这个过程也是并发执行的,可以与正在运行的goroutine同时进行。

因此,即使有一些goroutine正在运行,垃圾回收器也可以在并发执行的情况下完成垃圾回收。但是,在某些情况下如果垃圾回收器需要等待某些goroutine完成才能继续执行,它可能会暂停这些goroutine,并在垃圾回收完成后恢复它们的运行。

golang中 runtime.Gosched()函数作用

runtime.Gosched()函数是Go语言中的一个函数,它的作用是让出当前goroutine的执行权限,让其他goroutine有机会运行。当调用runtime.Gosched()函数时,当前goroutine会被暂停,然后被放回到等待运行的队列中,等待调度器重新安排它的运行。

这个函数通常用于帮助避免goroutine的饥饿状态,即某些goroutine一直占用CPU资源,导致其他goroutine无法运行。通过在适当的时候调用runtime.Gosched()函数,可以让其他goroutine有机会运行,并避免出现饥饿状态。

需要注意的是,runtime.Gosched()函数只是让出当前goroutine的执行权限,并不能保证其他goroutine会立即运行。调度器会根据一定的策略来安排goroutine的运行,因此在某些情况下,其他goroutine可能仍然无法运行。


Go GC 动作是需要所有正在运行 `goroutine` 都停止后进行的吗?的评论 (共 条)

分享到微博请遵守国家法律