aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mstats.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2017-03-31 17:09:41 -0400
committerAustin Clements <austin@google.com>2017-04-21 17:41:53 +0000
commit49a412a5b7f2b7ca6278da199b812bac3c683046 (patch)
treeec2f7a927067cfe78d4e6e49291f3d9d382ac069 /src/runtime/mstats.go
parent9d36163c0b35ddd384534f850fb04170e0d0c7c4 (diff)
downloadgo-49a412a5b7f2b7ca6278da199b812bac3c683046.tar.gz
go-49a412a5b7f2b7ca6278da199b812bac3c683046.zip
runtime: rationalize triggerRatio
gcController.triggerRatio is the only field in gcController that persists across cycles. As global mutable state, the places where it written and read are spread out, making it difficult to see that updates and downstream calculations are done correctly. Improve this situation by doing two things: 1) Move triggerRatio to memstats so it lives with the other trigger-related fields and makes gcController entirely transient state. 2) Commit the new trigger ratio during mark termination when we compute other next-cycle controls, including the absolute trigger. This forces us to explicitly thread the new trigger ratio from gcController.endCycle to mark termination, so we're not just pulling it out of global state. Change-Id: I6669932f8039a8c0ef46a3f2a8c537db72e578aa Reviewed-on: https://go-review.googlesource.com/39830 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
Diffstat (limited to 'src/runtime/mstats.go')
-rw-r--r--src/runtime/mstats.go12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/runtime/mstats.go b/src/runtime/mstats.go
index ae8c1e39c1..95824a9c09 100644
--- a/src/runtime/mstats.go
+++ b/src/runtime/mstats.go
@@ -94,11 +94,23 @@ type mstats struct {
last_gc_nanotime uint64 // last gc (monotonic time)
tinyallocs uint64 // number of tiny allocations that didn't cause actual allocation; not exported to go directly
+ // triggerRatio is the heap growth ratio that triggers marking.
+ //
+ // E.g., if this is 0.6, then GC should start when the live
+ // heap has reached 1.6 times the heap size marked by the
+ // previous cycle. This should be ≤ GOGC/100 so the trigger
+ // heap size is less than the goal heap size. This is set
+ // during mark termination for the next cycle's trigger.
+ triggerRatio float64
+
// gc_trigger is the heap size that triggers marking.
//
// When heap_live ≥ gc_trigger, the mark phase will start.
// This is also the heap size by which proportional sweeping
// must be complete.
+ //
+ // This is computed from triggerRatio during mark termination
+ // for the next cycle's trigger.
gc_trigger uint64
// heap_live is the number of bytes considered live by the GC.