Go GC 动作是需要所有正在运行 `goroutine` 都停止后进行的吗?
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可能仍然无法运行。