• Austin Clements's avatar
    runtime: snapshot heap profile during mark termination · eee85fc5
    Austin Clements authored
    Currently we snapshot the heap profile just *after* mark termination
    starts the world because it's a relatively expensive operation.
    However, this means any alloc or free events that happen between
    starting the world and snapshotting the heap profile can be accounted
    to the wrong cycle. In the worst case, a free can be accounted to the
    cycle before the alloc; if the heap is small, this can result
    temporarily in a negative "in use" count in the profile.
    
    Fix this without making STW more expensive by using a global heap
    profile cycle counter. This lets us split up the operation into a two
    parts: 1) a super-cheap snapshot operation that simply increments the
    global cycle counter during STW, and 2) a more expensive cleanup
    operation we can do after starting the world that frees up a slot in
    all buckets for use by the next heap profile cycle.
    
    Fixes #19311.
    
    Change-Id: I6bdafabf111c48b3d26fe2d91267f7bef0bd4270
    Reviewed-on: https://go-review.googlesource.com/37714
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarRick Hudson <rlh@golang.org>
    eee85fc5
mgc.go 64.4 KB