2012-03-23 31 views
0

我定义如下一类的一些全局变量:vb.net为什么在表单关闭后,类成员仍然占用内存?

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

但是我发现,这种形式被关闭后,上述所有变量var1,列表1,列表2仍然存在于内存中。我认为他们应该由gc收集,因为表格已经按我确认的方式处理了。

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

感谢

+0

处置并不意味着会立即GC'ed并从内存中删除。 – vcsjones 2012-03-23 16:22:20

+0

垃圾收集并不总是立即发生,所以事情可能会一直存在,直到GC运行。如果这些变量未在其他地方引用,则可能会标记并在下一次运行中清除。 – 2012-03-23 16:24:38

+0

推荐阅读:[每个人都认为垃圾收集是错误的](http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx)。 – delnan 2012-03-23 16:29:48

回答

-1

但是我发现在这个表单关闭之后,上面所有的变量var1,list1,list2仍然存在于内存中。

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

我认为他们应该由gc收集,因为表格已经按我确认的方式处理了。

,除非你调用Dispose方法明确,或包裹在using声明其创作的形式没有得到处置。但是这仍然不能“解决”你引用的问题,因为即使对象被丢弃,其成员使用的内存也不会立即回收。处置需要发布非托管资源;你在这里谈论管理的。

我不完全清楚你想要解决的实际问题。你的电脑内存不足?当您尝试在代码中创建新对象时,是否发生内存不足错误?如果没有,你为什么如此担心你的物品何时被释放?这就是垃圾收集环境的要点:让你不必担心这些事情。

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

+0

我正在使用Visual Studio调试器。我使用上述变量的表单上有一个自动更新过程。由于上述变量在表单关闭后仍然保留值,所以始终会调用自动更新过程,从而导致异常。 (一个简单的解决方法是检查form.isDisposed是否在更新过程中,但我认为这不是最重要的,此外,这些变量占用内存。) – Summer 2012-03-23 18:00:33

+0

@Summer:好的,您的自动更新过程如何工作?它检查哨兵值吗?只需在表单处理完毕后设置这些值。 – 2012-03-23 20:31:24

+0

自动更新过程检查我在问题中定义的全局变量,例如var1,list1。你的意思是说我在设计器中将这些值设置为Dispose?或者我可以简单地检查是否form.isDisposed在自动更新程序中? – Summer 2012-03-23 20:50:22

2

使用垃圾收集暗示着垃圾。这就是你所看到的。

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

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

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

相关问题