diff options
author | Austin Clements <austin@google.com> | 2017-03-31 17:09:41 -0400 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2017-04-21 17:41:53 +0000 |
commit | 49a412a5b7f2b7ca6278da199b812bac3c683046 (patch) | |
tree | ec2f7a927067cfe78d4e6e49291f3d9d382ac069 /src/runtime/mstats.go | |
parent | 9d36163c0b35ddd384534f850fb04170e0d0c7c4 (diff) | |
download | go-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.go | 12 |
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. |