2010-03-02 58 views
1

WPF内存泄漏问题。内存稳定,小文件,但增长,直到大文件的OOM例外。WPF内存泄漏,但仅当文档总占用空间超过阈值时

背景:

我们已经开发出用于控制动态显示的WPF应用程序。有一个“设计”组件,用户在其中放置显示文档和一个文档“显示”组件。

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

问题:

问题是与显示图形元素,以不同的图形之间的交叉衰落。淡入淡出是通过动画两个WPF图像控件(一个用于传入,一个用于传出)的不透明属性来完成的。

一切,只要能正常工作的应用程序的总内存占用,同时运行低于(尚未准确定义)阈值。当总占地面积增加时(例如,通过添加另一个具有大图形的图形元素),那么应用程序使用的总内存开始增加,并且最终呈现出OOM异常。大型图形本身或衰落图形本身没有内存泄漏问题,但只有组合。

有没有其他人看过类似的行为?任何解决方案的想法?我猜测这个问题与大对象堆碎片有关,但这只是一个猜测。

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

回答

0

为了正确诊断,您可以在崩溃点之前或之前从一个小型转储开始,并使用合适的调试程序(WinDbg with SOS,对我来说)来确定发生了什么。在Win7中(不是在XP中,对Vista没有把握),你可以通过右键单击任务管理器中的应用程序/进程并选择适当的选项来生成小型转储。

如果它不是大对象堆,那么它可能与GC有关。假设有一个关联类的开销与你添加的每个元素有关吗?是否有很多临时类正在创建(比如,在每个显示器上)?这可能是由于内存压力导致GC将大量对象推入Gen1和/或Gen2,这增加了内存压力。

SOS/WinDbg命令“!eeheap -gc”将打印您的GC代的大小,这可能会告诉您Gen2随着您的应用程序数据的增加而增加。