我在Go 上寫了我的第一個web服務器/ webservices程序,我意識到RSIZE(如命令行程序「top」所示)在向我的webservices重複相同的請求之後會增長。這是否意味着有內存泄漏?Go(lang)內存使用情況:RSIZE增長和139GB的VSIZE?
我還注意到,我的應用程序和「頂部」上的進程都有139GB的VSIZE(兩者都是這個大小)。這是正常的嗎?
我使用轉到1.1.2 OS X 10.8
非常感謝
我在Go 上寫了我的第一個web服務器/ webservices程序,我意識到RSIZE(如命令行程序「top」所示)在向我的webservices重複相同的請求之後會增長。這是否意味着有內存泄漏?Go(lang)內存使用情況:RSIZE增長和139GB的VSIZE?
我還注意到,我的應用程序和「頂部」上的進程都有139GB的VSIZE(兩者都是這個大小)。這是正常的嗎?
我使用轉到1.1.2 OS X 10.8
非常感謝
大VSIZE並不代表;不會擔心這一點。
單個請求後RSIZE的增長也不用擔心。 RAM被垃圾回收回收,這會花費CPU週期,所以Go和其他GC'd語言等待很多請求,直到他們需要釋放RAM(或者至少在分配大量RAM之前)以運行集合。更少的收藏=>更少的CPU時間。
在通常意義上的泄漏是罕見的,因爲GC應該最終釋放你沒有提及的內存。如果你的緩衝區按需增長但永遠不縮小,那麼這些緩衝區可能會產生類似泄漏的效果,如果你不小心持有一個真正死亡的內存引用,你可能會遇到問題。但除非這個過程永遠持續增長,否則我不會認爲你在這裏遇到了這個問題。
下面是Go的一些內存管理技巧;有些也間接適用於其他語言:
runtime.ReadMemStats(ms)
可以告訴你多久你的程序已經花了GC,有很多像你多少分配其他有用的信息(見runtime
模塊文檔在http://golang.org/pkg/runtime/)sync.Pool
包幫助,並有一個很好的回收的一般描述(從sync.Pool
是標準之前)on the CloudFlare blog。快樂去吧!
大VSIZE在達爾文是正常的。 RSIZE是否平穩,還是繼續增長? – JimB
我在OSX 10.7上注意到完全一樣的東西,所以我認爲VSIZE是正常的。它似乎不會對性能產生負面影響。 – Aktau