------------------------------------------
2015.7月更新
后面发现这里其实有一个sb的问题,在于内存回收和释放。
每个http请求,都会带一个http.Request, 当请求并发数上来的时候,若不主动进行释放。垃圾回收机制会认为这个对象还不能回收。
其实这里的本质问题,是一个http连接的生命周期是如何管理的,代码封装的太好,也需要知道里面如何实现啊(后面有空研究一下源码),不然还是会踩坑。
------------------------------------
golang写的一个图片服务器,在批量下载压缩时候发现内存不断增长。。。。
幸好golang自带内存占用日志结合分析工具可以方便看到内存分布。
详细可参考:
http://blog.golang.org/profiling-go-programs
可以实时统计CPU\内存信息。
这里主要说一下内存怎么搞。CPU分析的参考之前的一篇文章。
全部代码如下:
OK,加上这个内存分析数据之后,继续跑服务, 跑了一段时候之后,停止程序,采用以下命令进行分析。
初步可以定位到时下载压缩时,分配了太多byteSlice导致。
观察代码,没有发现具体原因,直到在网上发现了这篇文章:
http://openmymind.net/Go-Slices-And-The-Case-Of-The-Missing-Memory/
A Memory Leak
bytes.MinRead
大致的意思是说,这个buffer采用最小单位读,若不够,则继续申请2倍大的空间。
可以查看源码:
解决方案:
稍微测试了以下,内存被垃圾回收了。为啥会出现这样的情况呢?
在golang语言自带的bytes包里面申请的内存,为啥就不会很快被回收?
不解,IO操作这块儿还需要找时间重新学习一下。