2010-10-06 44 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