WPF内存泄漏,但仅限于总文档占用空间超过阈值时

时间:2010-03-02 20:04:34

标签: wpf memory-leaks

WPF内存泄漏问题。使用小文档时内存稳定,但在大文档的OOM异常之前会增长。

背景:

我们开发了一个用于控制动态显示的WPF应用程序。有一个Design组件,用户放置显示文档,文档显示组件。

显示中的元素可以包含文本和/或图形。每个元素可以使用各种过渡循环通过不同的字符串或图像 - 滚动,淡入淡出,闪烁等。

问题:

问题在于显示图形的元素,不同图形之间的交叉淡入淡出。淡入淡出是通过动画两个WPF图像控件的opacity属性来实现的(一个用于传入,一个用于传出)。

只要运行时应用程序的总内存占用量低于(尚未精确定义)阈值,一切正常。当总脚印增加时(例如,通过添加具有大图形的另一个图形元素),应用程序使用的总内存开始增长,并且最终会出现OOM异常。单独的大图形,或者它自己的褪色图形没有内存泄漏问题,只有组合。

还有其他人见过类似的行为吗?有什么解决方案吗?我猜这个问题与大对象堆碎片有关,但这只是猜测。

不幸的是,我没有要发布的示例代码,因为这是更大的解决方案的一部分。我将尝试创建一个示例应用程序来说明此行为并更新我的帖子。

1 个答案:

答案 0 :(得分:0)

要正确诊断这一点,您可以在崩溃点或之前使用minidump,并使用合适的调试器(带有SOS的WinDbg,对我而言)来计算正在发生的事情。在Win7中(不在XP中,不确定Vista),您可以通过右键单击任务管理器中的应用程序/进程并选择适当的选项来生成小型转储。

如果它不是大对象堆,那么它可能与GC相关。据推测,您添加的每个元素都会产生相关类的开销 - 是否会创建大量瞬态类(例如,在每个渲染的显示上)?可能是内存压力导致GC将大量对象推入Gen1和/或Gen2,这会增加内存压力。

SOS / WinDbg命令“!eeheap -gc”将打印GC代的大小,这可能会显示Gen2正在填满,因为应用程序的数据会增加。