Skip to content

Commit

Permalink
runtime: set heap minimum default based on GOGC
Browse files Browse the repository at this point in the history
Currently the heap minimum is set to 4MB which prevents our ability to
collect at every allocation by setting GOGC=0. This adjust the
heap minimum to 4MB*GOGC/100 thus reenabling collecting at every allocation.
Fixes #10681

Change-Id: I912d027dac4b14ae535597e8beefa9ac3fb8ad94
Reviewed-on: https://go-review.googlesource.com/9814
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
  • Loading branch information
RLH committed May 7, 2015
1 parent 7bdeab1 commit b6e178e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 13 deletions.
17 changes: 16 additions & 1 deletion src/runtime/mgc.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ const (
// heapminimum is the minimum number of bytes in the heap.
// This cleans up the corner case of where we have a very small live set but a lot
// of allocations and collecting every GOGC * live set is expensive.
// heapminimum is adjust by multiplying it by GOGC/100. In
// the special case of GOGC==0 this will set heapminimum to 0 resulting
// collecting at every allocation even when the heap size is small.
var heapminimum = uint64(4 << 20)

// Initialized from $GOGC. GOGC=off means no GC.
Expand All @@ -141,14 +144,25 @@ func gcinit() {
}

work.markfor = parforalloc(_MaxGcproc)
gcpercent = readgogc()
_ = setGCPercent(readgogc())
for datap := &firstmoduledata; datap != nil; datap = datap.next {
datap.gcdatamask = unrollglobgcprog((*byte)(unsafe.Pointer(datap.gcdata)), datap.edata-datap.data)
datap.gcbssmask = unrollglobgcprog((*byte)(unsafe.Pointer(datap.gcbss)), datap.ebss-datap.bss)
}
memstats.next_gc = heapminimum
}

func readgogc() int32 {
p := gogetenv("GOGC")
if p == "" {
return 100
}
if p == "off" {
return -1
}
return int32(atoi(p))
}

// gcenable is called after the bulk of the runtime initialization,
// just before we're about to start letting user code run.
// It kicks off the background sweeper goroutine and enables GC.
Expand All @@ -166,6 +180,7 @@ func setGCPercent(in int32) (out int32) {
in = -1
}
gcpercent = in
heapminimum = heapminimum * uint64(gcpercent) / 100
unlock(&mheap_.lock)
return out
}
Expand Down
12 changes: 0 additions & 12 deletions src/runtime/runtime1.go
Original file line number Diff line number Diff line change
Expand Up @@ -432,15 +432,3 @@ func reflect_typelinks() [][]*_type {
}
return ret
}

// TODO: move back into mgc.go
func readgogc() int32 {
p := gogetenv("GOGC")
if p == "" {
return 100
}
if p == "off" {
return -1
}
return int32(atoi(p))
}

0 comments on commit b6e178e

Please sign in to comment.