Go 通道上的范围循环和循环变量的垃圾收集
Range loop on a Go channel and garbage collection of the loop variable
考虑以下 Go 代码:
type LargeStructWithNestings struct {...}
func generatorChnl() <-chan *LargeStructWithNestings { ... }
// code snippet
chnl := generatorChnl()
for entry := range chnl { // line A
doStuffWith(entry)
entry = nil // line B
}
假设通道不经常产生值,并且这些是指向大型结构的指针,上面的 line B
是否会导致 entry
指向的内存的垃圾回收比其他方式更早发生做?或者,一旦循环回转至 line A
,entry
指向的内存中的先前位置是否会在下一次迭代在 line A
阻塞时立即符合垃圾回收条件?
objective 是想办法尽可能地减少常驻集的大小。
for
语句不会在迭代之间清除循环变量。有一个在每次迭代中重复使用的循环变量。因此,在从通道接收到新值之前,它将保留最后分配给它的值。
所以是的,如果从 chnl
接收块“长时间”,循环变量 entry
将保持对最后接收(和分配)项目的“引用”,从而防止它来自收集垃圾。
在实践中,这很少(如果有的话)成为问题。来自 channel 的值可能被“频繁”接收,接收到的值可能“很小”,也可能有其他参考,以及这些的任意组合。
如果在您的特定情况下这确实是一个问题,您可以清除该变量,但我从未遇到任何需要它的示例。
考虑以下 Go 代码:
type LargeStructWithNestings struct {...}
func generatorChnl() <-chan *LargeStructWithNestings { ... }
// code snippet
chnl := generatorChnl()
for entry := range chnl { // line A
doStuffWith(entry)
entry = nil // line B
}
假设通道不经常产生值,并且这些是指向大型结构的指针,上面的 line B
是否会导致 entry
指向的内存的垃圾回收比其他方式更早发生做?或者,一旦循环回转至 line A
,entry
指向的内存中的先前位置是否会在下一次迭代在 line A
阻塞时立即符合垃圾回收条件?
objective 是想办法尽可能地减少常驻集的大小。
for
语句不会在迭代之间清除循环变量。有一个在每次迭代中重复使用的循环变量。因此,在从通道接收到新值之前,它将保留最后分配给它的值。
所以是的,如果从 chnl
接收块“长时间”,循环变量 entry
将保持对最后接收(和分配)项目的“引用”,从而防止它来自收集垃圾。
在实践中,这很少(如果有的话)成为问题。来自 channel 的值可能被“频繁”接收,接收到的值可能“很小”,也可能有其他参考,以及这些的任意组合。
如果在您的特定情况下这确实是一个问题,您可以清除该变量,但我从未遇到任何需要它的示例。