golang可能导致内存泄漏的地方
2018年1月20日 · 8 字 · 1 分钟
核心
golang能够GC是程序声明的变量,而一些外部资源是不可以GC掉的,比如os.OpenFile
打开的文件句柄,sql.Open
打开的数据库连接句柄等资源。
开发中常用场景
http请求时
resp.Body
,刚开始写golang的时候,如果会用ioutil.readAll
去读取resp.Body
时会加上defer resp.Body.Close()
,后来有json.NewDecoder().decode()
时没有加,以为会自动关闭,没想到还是太天真了。不管什么情况都需要defer resp.Body.Close()
sql查询时
DB.Prepare
,数据库查询操作会得到一个rows
的资源,这个一般都关闭了,但是运行一段时间之后发现有内存泄漏,因为只用到了sql查询,所以只有数据库操作代码可以排查,尽快调试发现stmt
也有Close
方法,加上defer stmt.Close
之后,内存稳定了。