首页 > 解决方案 > 如何等待垃圾收集完成?

问题描述

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

假设我正在运行基准测试:

这里的问题是BenchmarkUnlimited创建了大量的分配,垃圾收集所有这些都需要时间,但BenchmarkNumCPU已经在运行,其结果可能会受到先前基准测试的影响。

有没有办法告诉 go 程序在运行下一个基准测试之前等待 GC 完成?

标签: gogarbage-collectionbenchmarking

解决方案


runtime.GC()Go 基准测试框架在运行每个基准测试之前已经调用。

所以没有问题 - 您可以放心,每个基准测试都是从以前的基准测试开始的。

请参阅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()
    . . .

推荐阅读