.net 使用System.Windows.Forms.Timer控件更新标签期间的内存使用情况

.net 使用System.Windows.Forms.Timer控件更新标签期间的内存使用情况,.net,winforms,garbage-collection,timer,.net,Winforms,Garbage Collection,Timer,我有一个标签为的表单,该表单由System.Windows.Forms.Timer控件每2秒更新一次。在task manager中,我看到即使程序什么都不做,内存使用量也在增加(但标签仍在使用最新信息进行更新,例如内存使用量)标签文本的示例代码: tlblRam.Text = string.Format("Ram: {0} MB", ConvertBytesToMegabytes(System.Diagnostics.Process.GetCurrentProcess().PrivateMemo

我有一个标签为的表单,该表单由System.Windows.Forms.Timer控件每2秒更新一次。在task manager中,我看到即使程序什么都不做,内存使用量也在增加(但标签仍在使用最新信息进行更新,例如内存使用量)标签文本的示例代码:

tlblRam.Text = string.Format("Ram: {0} MB", ConvertBytesToMegabytes(System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64).ToString("0.00"));
但如果我强制GC收集这些代,它会将所有内存返回到较低的状态。此外,它是在约5分钟的非活动程序工作后自动完成的。这是否意味着GC正在等待其2代周期,然后才收集所有属于tlblRam.Text值的字符串

这是否意味着GC正在等待其2代周期,然后才收集所有属于tlblRam.Text值的字符串

基本上,是的。在运行的Windows应用程序中,可能会有更多的东西要求并释放内存

更重要的是:别担心,这里没有问题。不要试图通过手动启动y=GC来“帮助”,这只会让事情变得更糟

这是否意味着GC正在等待其2代周期,然后才收集所有属于tlblRam.Text值的字符串

基本上,是的。在运行的Windows应用程序中,可能会有更多的东西要求并释放内存


更重要的是:别担心,这里没有问题。不要试图通过手动启动y=GC来“帮助”,这只会让事情变得更糟

谢谢你的回答。那么在这种情况下,如果垃圾在一段时间后释放,10-20Mb的垃圾是正常的吗?这里对我来说奇怪的是,旧的标签值似乎被标记为垃圾,但释放它们占用的内存却要花很多时间,因为字符串是不可变的,所以从堆中保留“旧”值毫无意义。但是如果启动程序的机器有足够的内存,.net似乎是这样工作的。您无法(从TaskMgr或Process.privatemorysize64)判断字符串发生了什么。您不想让GC频繁运行,有一个经过微调的算法为您进行调节。谢谢您的回答。那么在这种情况下,如果垃圾在一段时间后释放,10-20Mb的垃圾是正常的吗?这里对我来说奇怪的是,旧的标签值似乎被标记为垃圾,但释放它们占用的内存却要花很多时间,因为字符串是不可变的,所以从堆中保留“旧”值毫无意义。但是如果启动程序的机器有足够的内存,.net似乎是这样工作的。您无法(从TaskMgr或Process.privatemorysize64)判断字符串发生了什么。您不想让GC频繁运行,有一个经过微调的算法为您调节这一点。