Go踩过的坑之内存分配错误: fatal error: out of memory allocating heap arena metadata
目录
背景
在编译运行 golang 的项目时出现了以下错误
make slice panic: fatal error: out of memory allocating heap arena metadata
通过堆栈信息找到对应的代码
伪代码如下:
func Cal(){
......
var arr=make([]string,len(data))
......
}
代码一直没有变动,但是却突然出现这个错误,从这个错误来看明显就是指内存分配溢出了,所以大概率是 data 的数据量太大了,可能是哪里出现了问题
然而通过排查,data 的数据量是正常的, 长度大小都是正常的,那就很奇怪了
既然数据量是正常的,那么就极有可能是机器(代码运行编译的机器)内存不够了
通过执行 free -h,发现果然机器的内存几乎要满了…….
所以看起来不是代码的问题,然后就紧急修复+扩容了机器
最后重新编译、运行项目正常
那几乎就可以判断问题出在机器的内存上了
重现
从上面我们得出错误是是为可分配内存不够了,为了进一步验证
我们在本地机器进行大容量 make ,看下是否会出现之前的错误
重现代码如下:
func main(){
var peek []byte
//var len=1000*1000*1000 //success
//var len=1000*1000*1000*1000// fatal error: out of memory allocating heap arena metadata
var len=1000*1000*1000*1000*1000 //panic: runtime error: makeslice: len out of range
//var len=-8//panic: runtime error: makeslice: len out of range
peek = append(peek, make([]byte, len)...)
fmt.Println("end......")
}
结果 报错确实是之前的错误
总结
错误:fatal error: out of memory allocating heap arena metadata
主要原因:就是内存溢出,也就是需要分配的内存超过了机器当前可用内存
这种需要排查两个方面:
-
代码是否正常,分配的内存是否合理(有可能分页失效导致所有数据加载到内存) — 优化代码
-
机器运行内存是否正常(可能存在僵尸进程)— 处理耗内存进程 / 扩容
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!