mirror of
https://github.com/golang/go
synced 2024-11-19 22:54:39 -07:00
runtime: more graceful out-of-memory crash
Used to fault trying to access l->list->next when l->list == nil after MCentral_AllocList. Now prints runtime: out of memory: no room in arena for 65536-byte allocation (536870912 in use) throw: out of memory followed by stack trace. Fixes #1650. R=r, dfc CC=golang-dev https://golang.org/cl/4446062
This commit is contained in:
parent
b1deb3be7f
commit
e2f9c73391
@ -22,6 +22,8 @@ runtime·MCache_Alloc(MCache *c, int32 sizeclass, uintptr size, int32 zeroed)
|
|||||||
// Replenish using central lists.
|
// Replenish using central lists.
|
||||||
n = runtime·MCentral_AllocList(&runtime·mheap.central[sizeclass],
|
n = runtime·MCentral_AllocList(&runtime·mheap.central[sizeclass],
|
||||||
runtime·class_to_transfercount[sizeclass], &first);
|
runtime·class_to_transfercount[sizeclass], &first);
|
||||||
|
if(n == 0)
|
||||||
|
runtime·throw("out of memory");
|
||||||
l->list = first;
|
l->list = first;
|
||||||
l->nlist = n;
|
l->nlist = n;
|
||||||
c->size += n*size;
|
c->size += n*size;
|
||||||
|
@ -180,8 +180,10 @@ MHeap_Grow(MHeap *h, uintptr npage)
|
|||||||
// Allocate a multiple of 64kB (16 pages).
|
// Allocate a multiple of 64kB (16 pages).
|
||||||
npage = (npage+15)&~15;
|
npage = (npage+15)&~15;
|
||||||
ask = npage<<PageShift;
|
ask = npage<<PageShift;
|
||||||
if(ask > h->arena_end - h->arena_used)
|
if(ask > h->arena_end - h->arena_used) {
|
||||||
|
runtime·printf("runtime: out of memory: no room in arena for %D-byte allocation (%D in use)\n", (uint64)ask, (uint64)(h->arena_used - h->arena_start));
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
if(ask < HeapAllocChunk && HeapAllocChunk <= h->arena_end - h->arena_used)
|
if(ask < HeapAllocChunk && HeapAllocChunk <= h->arena_end - h->arena_used)
|
||||||
ask = HeapAllocChunk;
|
ask = HeapAllocChunk;
|
||||||
|
|
||||||
@ -191,8 +193,10 @@ MHeap_Grow(MHeap *h, uintptr npage)
|
|||||||
ask = npage<<PageShift;
|
ask = npage<<PageShift;
|
||||||
v = runtime·MHeap_SysAlloc(h, ask);
|
v = runtime·MHeap_SysAlloc(h, ask);
|
||||||
}
|
}
|
||||||
if(v == nil)
|
if(v == nil) {
|
||||||
|
runtime·printf("runtime: out of memory: operating system refused %D-byte allocation\n", (uint64)ask);
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mstats.heap_sys += ask;
|
mstats.heap_sys += ask;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user