我正在Go中编写我的第一个webserver / webservices程序 我意识到RSIZE(如命令行程序“top”所示)在向我的webservices重复相同的请求后会增长。这是否意味着存在内存泄漏?
我还注意到我的应用程序和“top”上的go进程都有一个139GB的VSIZE(两者都是那个大小)。这是正常的吗?
我在OS X 10.8上使用Go 1.1.2
非常感谢
答案 0 :(得分:3)
大VSIZE并不意味着你真的在使用物理内存;我不担心。
RSIZE在单一请求后增长也不用担心。 RAM由垃圾收集回收,这会花费CPU周期,所以Go和其他GC语言等待许多请求,直到他们需要释放RAM(或者至少直到分配了大量RAM)来运行集合。收藏次数减少=>减少花费的CPU时间。
通常意义上的泄漏是罕见的,因为GC最终应该释放你没有引用的内存。如果你有缓冲区,根据需要增长,但永远不会缩小,那些可能会产生类似泄漏的效果,如果你不小心持有对真正死亡的内存的引用,你可能会遇到问题。但除非这个过程永远在增长,否则我不会认为你在这里遇到了这个问题。
以下是Go的一些内存管理技巧;有些也间接适用于其他语言:
runtime.ReadMemStats(ms)
可以告诉您程序在GC中花了多长时间,以及许多其他有用的信息,例如您分配的数量(请参阅http://golang.org/pkg/runtime/上的runtime
模块文档) sync.Pool
包有助于解决这个问题,并且对回收有一个很好的一般描述(从sync.Pool
标准之前开始)on the CloudFlare blog。快乐的去!