mirror of
https://github.com/golang/go
synced 2024-09-28 18:14:29 -06:00
[release-branch.go1.9] runtime: make runtime.GC() trigger GC even if GOGC=off
Currently, the priority of checks in (gcTrigger).test() puts the gcpercent<0 test above gcTriggerCycle, which is used for runtime.GC(). This is an unintentional change from 1.8 and before, where runtime.GC() triggered a GC even if GOGC=off. Fix this by rearranging the priority so the gcTriggerCycle test executes even if gcpercent < 0. Fixes #22023. Change-Id: I109328d7b643b6824eb9d79061a9e775f0149575 Reviewed-on: https://go-review.googlesource.com/65994 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org> Reviewed-on: https://go-review.googlesource.com/70979 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
0ab99b396d
commit
ebfcdef901
@ -499,3 +499,19 @@ func BenchmarkReadMemStats(b *testing.B) {
|
||||
|
||||
hugeSink = nil
|
||||
}
|
||||
|
||||
func TestUserForcedGC(t *testing.T) {
|
||||
// Test that runtime.GC() triggers a GC even if GOGC=off.
|
||||
defer debug.SetGCPercent(debug.SetGCPercent(-1))
|
||||
|
||||
var ms1, ms2 runtime.MemStats
|
||||
runtime.ReadMemStats(&ms1)
|
||||
runtime.GC()
|
||||
runtime.ReadMemStats(&ms2)
|
||||
if ms1.NumGC == ms2.NumGC {
|
||||
t.Fatalf("runtime.GC() did not trigger GC")
|
||||
}
|
||||
if ms1.NumForcedGC == ms2.NumForcedGC {
|
||||
t.Fatalf("runtime.GC() was not accounted in NumForcedGC")
|
||||
}
|
||||
}
|
||||
|
@ -1158,7 +1158,7 @@ func (t gcTrigger) test() bool {
|
||||
if t.kind == gcTriggerAlways {
|
||||
return true
|
||||
}
|
||||
if gcphase != _GCoff || gcpercent < 0 {
|
||||
if gcphase != _GCoff {
|
||||
return false
|
||||
}
|
||||
switch t.kind {
|
||||
@ -1169,6 +1169,9 @@ func (t gcTrigger) test() bool {
|
||||
// own write.
|
||||
return memstats.heap_live >= memstats.gc_trigger
|
||||
case gcTriggerTime:
|
||||
if gcpercent < 0 {
|
||||
return false
|
||||
}
|
||||
lastgc := int64(atomic.Load64(&memstats.last_gc_nanotime))
|
||||
return lastgc != 0 && t.now-lastgc > forcegcperiod
|
||||
case gcTriggerCycle:
|
||||
|
Loading…
Reference in New Issue
Block a user