vb.net为什么表单关闭后,类成员仍然占用内存?

时间:2012-03-23 16:18:45

标签: vb.net garbage-collection

我定义了一个类的一些全局变量,如下所示:

Private Class MyClass
Private var1 as Decimal
Private list1 as List(Of string)
Private list2 as List(Of string)
....'Subs here
End Class

但我发现在关闭此表单后,所有上述变量var1,list1,list2仍然存在于内存中。我认为它们应该由gc收集,因为我确认已经处理了表格。

添加:表格关闭后半小时我已经监控了。但这些变量不是由gc收集的。我在表单上有一个使用上述变量的自动更新程序。由于上述变量仍保留值,因此始终会调用自动更新过程,从而导致异常。 (一个快速解决方法是检查更新过程中是否有form.isDisposed。但我不认为这是一个重要的。此外,这些变量占用内存。)

由于

2 个答案:

答案 0 :(得分:2)

使用垃圾收集意味着存在垃圾。这就是你所看到的。

对引用进行计数的内存管理系统可以在不再引用它们时立即删除对象,但这也意味着在此时删除对象的成本。

在使用垃圾收集的系统中,该成本以特定间隔进行,并且每个对象的成本较低,因为它一次性删除了大量对象。在垃圾收集之间,未使用的对象保留在内存中。

此外,并非每个垃圾收集都会删除所有未使用的对象。存在不同级别的垃圾收集,其中最常见的只收集未使用的短期对象。

答案 1 :(得分:-1)

  

但我发现在关闭此表单后,所有上述变量var1,list1,list2仍然存在于内存中。

这是预期的行为;垃圾收集是非确定性的,这意味着您无法准确预测对象声明的内存何时将被回收。垃圾收集是一个昂贵的过程,并且该算法足够智能,可以将其延迟到绝对必要时(即,当你缺乏内存时)。

  

我认为他们应该被gc收集,因为我确认已经处理了表格。

除非您明确调用Dispose方法,或将其创建包装在using语句中,否则不会处理表单。但是仍然不会“解决”你引用的问题,因为即使对象被处理掉,其成员使用的内存也不会立即回收。需要处置以释放非托管资源;你在这里谈论托管的

我一点也不清楚你要解决的实际问题是什么。你的电脑内存不足吗?当您尝试在代码中创建新对象时,是否会出现内存不足错误?如果没有,你为什么这么担心你的对象什么时候被释放?这就是垃圾收集环境的重点:让您不必担心这些事情。

我也不确定您使用哪些工具来检查存储在这些内存位置的数据,但如果它是Visual Studio调试器,则会收到错误的信息。在调试器下运行时,实际上会扩展对象生存期,以便您可以检查它们的值。