目录

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

主要原因:就是内存溢出,也就是需要分配的内存超过了机器当前可用内存

这种需要排查两个方面:

  • 代码是否正常,分配的内存是否合理(有可能分页失效导致所有数据加载到内存) — 优化代码

  • 机器运行内存是否正常(可能存在僵尸进程)— 处理耗内存进程 / 扩容

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/go-err-2/

备用原文链接: https://blog.fiveyoboy.com/articles/go-err-2/