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:
parent
fd7ff20495
commit
aea99eda0f
@ -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);
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user