]> Cypherpunks repositories - gostls13.git/commit
runtime: snapshot heap profile during mark termination
authorAustin Clements <austin@google.com>
Wed, 1 Mar 2017 18:58:22 +0000 (13:58 -0500)
committerAustin Clements <austin@google.com>
Fri, 31 Mar 2017 01:14:56 +0000 (01:14 +0000)
commiteee85fc5a1071c8c7d8d804e898da6394ffbdec3
treec1eb3c5d7372be87969c7a22cb38abdd81e1b55a
parent3ebe7d7d110ba2573cfd597bb786d14749181cc3
runtime: snapshot heap profile during mark termination

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: Rick Hudson <rlh@golang.org>
src/runtime/mgc.go
src/runtime/mprof.go