From 5b7497f327f83510193b1ec1de2eabb287a02982 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sun, 11 Sep 2016 20:03:14 -0400 Subject: [PATCH] runtime: update heap profile stats after world is started Updating the heap profile stats is one of the most expensive parts of mark termination other than stack rescanning, but there's really no need to do this with the world stopped. Move it to right after we've started the world back up. This creates a *very* small window where allocations from the next cycle can slip into the profile, but the exact point where mark termination happens is so non-deterministic already that a slight reordering here is unimportant. Change-Id: I2f76f22c70329923ad6a594a2c26869f0736d34e Reviewed-on: https://go-review.googlesource.com/31363 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Rick Hudson --- src/runtime/mgc.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index 682790587b..4db84662db 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -1276,6 +1276,18 @@ func gcMarkTermination() { systemstack(startTheWorldWithSema) + // Update heap profile stats if gcSweep didn't do it. This is + // relatively expensive, so we don't want to do it while the + // world is stopped, but it needs to happen ASAP after + // starting the world to prevent too many allocations from the + // next cycle leaking in. It must happen before releasing + // worldsema since there are applications that do a + // runtime.GC() to update the heap profile and then + // immediately collect the profile. + if _ConcurrentSweep && work.mode != gcForceBlockMode { + mProf_GC() + } + // Free stack spans. This must be done between GC cycles. systemstack(freeStackSpans) @@ -1714,7 +1726,6 @@ func gcSweep(mode gcMode) { ready(sweep.g, 0, true) } unlock(&sweep.lock) - mProf_GC() } func gcCopySpans() { -- 2.48.1