如何等待垃圾收集完成?

How to wait for garbage collection to complete?

我想知道有没有办法等待 GC 完成?

假设我是 运行 基准:

这里的问题是 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()
    . . .