• Austin Clements's avatar
    runtime: make runtime.GC() trigger a concurrent GC · 9ffbdabd
    Austin Clements authored
    Currently runtime.GC() triggers a STW GC. For common uses in tests and
    benchmarks, it doesn't matter whether it's STW or concurrent, but for
    uses in servers for things like collecting heap profiles and
    controlling memory footprint, this pause can be a bit problem for
    latency.
    
    This changes runtime.GC() to trigger a concurrent GC. In order to
    remain as close as possible to its current meaning, we define it to
    always perform a full mark/sweep GC cycle before returning (even if
    that means it has to finish up a cycle we're in the middle of first)
    and to publish the heap profile as of the triggered mark termination.
    While it must perform a full cycle, simultaneous runtime.GC() calls
    can be consolidated into a single full cycle.
    
    Fixes #18216.
    
    Change-Id: I9088cc5deef4ab6bcf0245ed1982a852a01c44b5
    Reviewed-on: https://go-review.googlesource.com/37520
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    9ffbdabd
mprof.go 24.2 KB