mirror of https://github.com/golang/go.git
runtime: track forced GCs independent of gcMode
Currently gcMode != gcBackgroundMode implies this was a user-forced GC cycle. This is no longer going to be true when we make runtime.GC() trigger a concurrent GC, so replace this with an explicit work.userForced bit. For #18216. Change-Id: If7d71bbca78b5f0b35641b070f9d457f5c9a52bd Reviewed-on: https://go-review.googlesource.com/37519 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
This commit is contained in:
parent
786eb5b754
commit
29fdbcfea3
|
|
@ -857,6 +857,10 @@ var work struct {
|
|||
// mode is the concurrency mode of the current GC cycle.
|
||||
mode gcMode
|
||||
|
||||
// userForced indicates the current GC cycle was forced by an
|
||||
// explicit user call.
|
||||
userForced bool
|
||||
|
||||
// totaltime is the CPU nanoseconds spent in GC since the
|
||||
// program started if debug.gctrace > 0.
|
||||
totaltime int64
|
||||
|
|
@ -992,7 +996,7 @@ func gcStart(mode gcMode, trigger gcTrigger) {
|
|||
}
|
||||
|
||||
// For stats, check if this GC was forced by the user.
|
||||
forced := trigger.kind == gcTriggerAlways
|
||||
work.userForced = trigger.kind == gcTriggerAlways
|
||||
|
||||
// In gcstoptheworld debug mode, upgrade the mode accordingly.
|
||||
// We do this after re-checking the transition condition so
|
||||
|
|
@ -1087,10 +1091,6 @@ func gcStart(mode gcMode, trigger gcTrigger) {
|
|||
work.tMark, work.tMarkTerm = t, t
|
||||
work.heapGoal = work.heap0
|
||||
|
||||
if forced {
|
||||
memstats.numforcedgc++
|
||||
}
|
||||
|
||||
// Perform mark termination. This will restart the world.
|
||||
gcMarkTermination()
|
||||
}
|
||||
|
|
@ -1330,6 +1330,10 @@ func gcMarkTermination() {
|
|||
sweep.nbgsweep = 0
|
||||
sweep.npausesweep = 0
|
||||
|
||||
if work.userForced {
|
||||
memstats.numforcedgc++
|
||||
}
|
||||
|
||||
// Finish the current heap profiling cycle and start a new
|
||||
// heap profiling cycle. We do this before starting the world
|
||||
// so events don't leak into the wrong cycle.
|
||||
|
|
@ -1378,7 +1382,7 @@ func gcMarkTermination() {
|
|||
work.heap0>>20, "->", work.heap1>>20, "->", work.heap2>>20, " MB, ",
|
||||
work.heapGoal>>20, " MB goal, ",
|
||||
work.maxprocs, " P")
|
||||
if work.mode != gcBackgroundMode {
|
||||
if work.userForced {
|
||||
print(" (forced)")
|
||||
}
|
||||
print("\n")
|
||||
|
|
|
|||
Loading…
Reference in New Issue