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值的字符串?
谢谢你的回答。因此,如果在一段时间后释放垃圾,这种情况下10-20Mb的垃圾是否正常?对我来说,这里的奇怪之处在于,旧标签值似乎被标记为垃圾,但释放它们的内存花费了很多时间,字符串是不可变的,并且从堆中保留“旧”值是没有意义的。看起来.net以这种方式工作,如果程序启动的机器有足够的内存。 – 0x49D1 2010-10-06 08:25:33
你不能告诉(从TaskMgr或Process.PrivateMemorySize64)发生什么事情的字符串。你不希望GC频繁运行,有一个调整好的算法可以为你调整。 – 2010-10-06 08:40:30