golang可能导致内存泄漏的地方

2018年1月20日 · 8 字 · 1 分钟

核心

golang能够GC是程序声明的变量,而一些外部资源是不可以GC掉的,比如os.OpenFile打开的文件句柄,sql.Open打开的数据库连接句柄等资源。

开发中常用场景

  1. http请求时resp.Body,刚开始写golang的时候,如果会用ioutil.readAll去读取resp.Body时会加上defer resp.Body.Close(),后来有json.NewDecoder().decode()时没有加,以为会自动关闭,没想到还是太天真了。不管什么情况都需要defer resp.Body.Close()

  2. sql查询时DB.Prepare,数据库查询操作会得到一个rows的资源,这个一般都关闭了,但是运行一段时间之后发现有内存泄漏,因为只用到了sql查询,所以只有数据库操作代码可以排查,尽快调试发现stmt也有Close方法,加上defer stmt.Close之后,内存稳定了。