1
0
mirror of https://github.com/golang/go synced 2024-11-13 16:50:23 -07:00

runtime: fix runaway memory usage

It was caused by mstats.heap_alloc skew.
Fixes #7430.

LGTM=khr
R=golang-codereviews, khr
CC=golang-codereviews, rsc
https://golang.org/cl/69870055
This commit is contained in:
Dmitriy Vyukov 2014-03-06 21:33:00 +04:00
parent fd7ff20495
commit aea99eda0f
3 changed files with 6 additions and 2 deletions

View File

@ -329,6 +329,7 @@ runtime·free(void *v)
// it might coalesce v and other blocks into a bigger span // it might coalesce v and other blocks into a bigger span
// and change the bitmap further. // and change the bitmap further.
c->local_nsmallfree[sizeclass]++; c->local_nsmallfree[sizeclass]++;
c->local_cachealloc -= size;
if(c->alloc[sizeclass] == s) { if(c->alloc[sizeclass] == s) {
// We own the span, so we can just add v to the freelist // We own the span, so we can just add v to the freelist
runtime·markfreed(v); runtime·markfreed(v);

View File

@ -97,7 +97,6 @@ runtime·MCache_Free(MCache *c, MLink *p, int32 sizeclass, uintptr size)
p->next = l->list; p->next = l->list;
l->list = p; l->list = p;
l->nlist++; l->nlist++;
c->local_cachealloc -= size;
// We transfer a span at a time from MCentral to MCache, // We transfer a span at a time from MCentral to MCache,
// so we'll do the same in the other direction. // so we'll do the same in the other direction.

View File

@ -2346,8 +2346,12 @@ gc(struct gc_args *args)
runtime·printf("pause %D\n", t4-t0); runtime·printf("pause %D\n", t4-t0);
if(runtime·debug.gctrace) { if(runtime·debug.gctrace) {
updatememstats(&stats);
heap1 = mstats.heap_alloc; heap1 = mstats.heap_alloc;
updatememstats(&stats);
if(heap1 != mstats.heap_alloc) {
runtime·printf("runtime: mstats skew: heap=%p/%p\n", heap1, mstats.heap_alloc);
runtime·throw("mstats skew");
}
obj = mstats.nmalloc - mstats.nfree; obj = mstats.nmalloc - mstats.nfree;
stats.nprocyield += work.markfor->nprocyield; stats.nprocyield += work.markfor->nprocyield;