如何等待垃圾收集完成?
How to wait for garbage collection to complete?
我想知道有没有办法等待 GC 完成?
假设我是 运行 基准:
BenchmarkUnlimited
(做很多工作)
BenchmarkNumCPU
(受BenchmarkUnlimited
影响)
这里的问题是 BenchmarkUnlimited
创建了很多分配,垃圾收集所有这些都需要时间,但是 BenchmarkNumCPU
已经是 运行 并且它的结果会受到以前的基准。
有没有办法告诉 go 程序在 运行 下一个基准测试之前等待 GC 完成?
Go 基准测试框架已在 运行 每个基准测试之前调用 runtime.GC()
。
所以没有问题 - 您可以放心,每个基准测试都是在没有以前基准测试产生的垃圾的情况下启动的。
参见 go/src/testing/benchmark.go
:(还要注意那里的评论)
func (b *B) runN(n int) {
benchmarkLock.Lock()
defer benchmarkLock.Unlock()
defer b.runCleanup(normalPanic)
// Try to get a comparable environment for each run
// by clearing garbage from previous runs.
runtime.GC() // <========== HERE
b.raceErrors = -race.Errors()
b.N = n
b.parallelism = 1
b.ResetTimer()
b.StartTimer()
b.benchFunc(b)
b.StopTimer()
. . .
我想知道有没有办法等待 GC 完成?
假设我是 运行 基准:
BenchmarkUnlimited
(做很多工作)BenchmarkNumCPU
(受BenchmarkUnlimited
影响)
这里的问题是 BenchmarkUnlimited
创建了很多分配,垃圾收集所有这些都需要时间,但是 BenchmarkNumCPU
已经是 运行 并且它的结果会受到以前的基准。
有没有办法告诉 go 程序在 运行 下一个基准测试之前等待 GC 完成?
Go 基准测试框架已在 运行 每个基准测试之前调用 runtime.GC()
。
所以没有问题 - 您可以放心,每个基准测试都是在没有以前基准测试产生的垃圾的情况下启动的。
参见 go/src/testing/benchmark.go
:(还要注意那里的评论)
func (b *B) runN(n int) {
benchmarkLock.Lock()
defer benchmarkLock.Unlock()
defer b.runCleanup(normalPanic)
// Try to get a comparable environment for each run
// by clearing garbage from previous runs.
runtime.GC() // <========== HERE
b.raceErrors = -race.Errors()
b.N = n
b.parallelism = 1
b.ResetTimer()
b.StartTimer()
b.benchFunc(b)
b.StopTimer()
. . .