2010-10-06 43 views
1

我有一個標籤由System.Windows.Forms.Timer控件每2秒更新一次。在任務管理器我看到該內存使用量越來越大,即使程序是什麼都不做(但標籤仍與最新的信息更新,即例如內存使用率)的標籤文本的示例代碼:使用System.Windows.Forms.Timer控件更新標籤期間的內存使用

tlblRam.Text = string.Format("Ram: {0} MB", ConvertBytesToMegabytes(System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64).ToString("0.00")); 

但如果我這樣做迫使GC收集世代 - 它將所有的記憶恢復到較低的狀態。此外,它在約5分鐘的非活動程序工作後自動完成。這是否意味着GC正在等待其2週期循環,然後才收集所有tlblRam.Text值的字符串?

回答

1

這是否意味着GC正在等待其2週期循環,然後才收集所有tlblRam.Text值的字符串?

基本上,是的。在正在運行的Windows應用程序中,可能會有更多的東西聲明和釋放內存。

更重要的:不要擔心,這裏沒有問題。不要試圖通過手動啓動y = GC來「幫助」,否則只會使情況變得更糟。

+0

謝謝你的回答。因此,如果在一段時間後釋放垃圾,這種情況下10-20Mb的垃圾是否正常?對我來說,這裏的奇怪之處在於,舊標籤值似乎被標記爲垃圾,但釋放它們的內存花費了很多時間,字符串是不可變的,並且從堆中保留「舊」值是沒有意義的。看起來.net以這種方式工作,如果程序啓動的機器有足夠的內存。 – 0x49D1 2010-10-06 08:25:33

+0

你不能告訴(從TaskMgr或Process.PrivateMemorySize64)發生什麼事情的字符串。你不希望GC頻繁運行,有一個調整好的算法可以爲你調整。 – 2010-10-06 08:40:30