【发布时间】:2012-09-24 14:49:02
【问题描述】:
我在一个小型 WPF 应用程序中有一个奇怪的行为。我在一个窗口上有一个按钮,它作为一个对话框打开另一个窗口,其中有一些动态添加的控件。在这样做的同时,我会注意它的内存使用量增加(sysinternal procexp)。但是当我关闭那个窗口时,内存使用量并没有恢复。
【问题讨论】:
-
当系统内存不低时将内存释放回操作系统不符合 GC 的利益,因此应用程序内存使用量的外部测量并不能准确反映内存有多少实际被消耗。为此,您需要获得 .NET 特定的内存分析工具。
-
但是我已经尝试显式调用 GC.Collect,这样即使不需要释放内存,垃圾收集器也会运行。这没有任何区别。
-
很可能有些东西没有被处理掉。
-
@Akif,强制收集可能会释放托管堆上的内存,但不必将分配给托管堆的内存释放回操作系统。只要系统内存不低,GC 就可以保留已分配给堆的内存。
-
@Dan Bryant 您的陈述似乎合乎逻辑。当我关闭最后打开的窗口然后重新打开它时,会调用先前打开的窗口的析构函数。这证明 GC 在它认为应该释放一些内存时运行,因为正在创建的对象将需要更多内存。如何确保在 UI 上关闭的对象确实被 GC 立即收集。
标签: wpf memory garbage-collection