------------------------------------------

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操作这块儿还需要找时间重新学习一下。