aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorRick Hudson <rlh@golang.org>2015-05-06 15:58:20 -0400
committerRick Hudson <rlh@golang.org>2015-05-07 21:05:58 +0000
commitb6e178ed7ee4781020b5e2d2dbc5346e8de42ee2 (patch)
tree0eae6360d431fc343ef32bf623526d43bdf2449a /src/runtime
parent7bdeab1b2f54b22e7840b601b2d90188f6ee8ae0 (diff)
downloadgo-b6e178ed7ee4781020b5e2d2dbc5346e8de42ee2.tar.xz
runtime: set heap minimum default based on GOGC
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>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/mgc.go17
-rw-r--r--src/runtime/runtime1.go12
2 files changed, 16 insertions, 13 deletions
diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go
index 90d5a12e93..9bd36d1a5e 100644
--- a/src/runtime/mgc.go
+++ b/src/runtime/mgc.go
@@ -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.
@@ -141,7 +144,7 @@ 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)
@@ -149,6 +152,17 @@ func gcinit() {
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.
@@ -166,6 +180,7 @@ func setGCPercent(in int32) (out int32) {
in = -1
}
gcpercent = in
+ heapminimum = heapminimum * uint64(gcpercent) / 100
unlock(&mheap_.lock)
return out
}
diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go
index 2151be59f9..ea3883018b 100644
--- a/src/runtime/runtime1.go
+++ b/src/runtime/runtime1.go
@@ -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))
-}