Golang)内存使用情况:RESIZE增长和SIZE为139GB?

时间:2013-09-29 16:50:03

标签: memory-management memory-leaks go

我正在Go中编写我的第一个webserver / webservices程序 我意识到RSIZE(如命令行程序“top”所示)在向我的webservices重复相同的请求后会增长。这是否意味着存在内存泄漏?

我还注意到我的应用程序和“top”上的go进程都有一个139GB的VSIZE(两者都是那个大小)。这是正常的吗?

我在OS X 10.8上使用Go 1.1.2

非常感谢

1 个答案:

答案 0 :(得分:3)

大VSIZE并不意味着你真的在使用物理内存;我不担心。

RSIZE在单一请求后增长也不用担心。 RAM由垃圾收集回收,这会花费CPU周期,所以Go和其他GC语言等待许多请求,直到他们需要释放RAM(或者至少直到分配了大量RAM)来运行集合。收藏次数减少=>减少花费的CPU时间。

通常意义上的泄漏是罕见的,因为GC最终应该释放你没有引用的内存。如果你有缓冲区,根据需要增长,但永远不会缩小,那些可能会产生类似泄漏的效果,如果你不小心持有对真正死亡的内存的引用,你可能会遇到问题。但除非这个过程永远在增长,否则我不会认为你在这里遇到了这个问题。

以下是Go的一些内存管理技巧;有些也间接适用于其他语言:

  • 你经常不用担心。收集通常非常快,并且相对于数据大小,您通常需要使用大量RAM。在您潜入之前,请确保有问题可以解决。 :)
  • runtime.ReadMemStats(ms)可以告诉您程序在GC中花了多长时间,以及许多其他有用的信息,例如您分配的数量(请参阅http://golang.org/pkg/runtime/上的runtime模块文档)
  • 如果你在GC上花费太多时间并且不知道为什么,memprofile是下一步; Go博客上有一个完整的示例,包括为程序提供一个可选的-memprofile标志:http://blog.golang.org/profiling-go-programs
  • 通常,您可以通过减少不需要的分配来减少GC,尤其是大对象的分配(例如,缓存持有整个HTTP响应)。有时候有一些自然的方法可以在不污染程序的情况下执行此操作 - 例如,您可以在循环的多次迭代中重用对象,而不是每次都分配。其他时候,您可以回收旧对象而不是制作新对象;标准sync.Pool包有助于解决这个问题,并且对回收有一个很好的一般描述(从sync.Pool标准之前开始)on the CloudFlare blog

快乐的去!