WPF内存使用情况

时间:2009-05-08 20:16:46

标签: wpf performance memory-management listbox datatemplate

应用:

  • WPF应用程序由顶部的文本框和下面的列表框组成
  • 用户在TextBox中键入字符串以查找员工,搜索结果显示在ListBox
  • ListBox使用DataTemplates显示元素(显示员工姓名,部门,电话和缩略图。)

实现:

  • 在应用程序启动时,我查询数据库并检索要在ListBox中显示的所有员工和相关信息。这一直保存在记忆中。
  • 应用程序启动后,所有可搜索的数据都在内存中,搜索几乎是即时的。所有搜索都在内存中的数据上执行。
  • 使用DataTemplates在ListBox中显示搜索结果。缩略图图片,名称,电话,部门等显示在每个ListBox项目中。

问题:

  • 启动时内存使用量约为200MB。
  • 当数据在列表框中更改时,无论是通过新搜索还是简单地向下滚动列表框,内存消耗都会增加。
  • 当用户慢慢向下滚动列表框时,内存增加得更快。当你上下滚动时,内存很快会达到1GB。

没有代码手动创建控件 - 一切都是通过数据绑定完成的。

为什么我会看到这种行为?我该怎么办才能修复它?请帮忙!

更新: 我发现问题不是内存泄漏。这里的问题是列表框正在创建对象以显示员工的图像,并且在listboxitem离开窗口后不会为垃圾收集器发布。 CleanUpVirtualizedItem事件按我的预期发生,但内存仍未释放。有什么想法吗?

6 个答案:

答案 0 :(得分:6)

冒着油腻的风险,你有内存泄漏。为什么不尝试像ANTS *这样的工具来追踪它。他们有免费试用,我从未使用它,但它有良好的声誉。

*可以使用其他分析工具。

如果您不想使用其他工具,可以尝试在每次创建类时增加静态成员,并在每次处理实例时减少静态成员。这将帮助您跟踪未被正确销毁的实例。

答案 1 :(得分:3)

LOL 200MB启动和1GB运行..对x64的更常见的惩罚(你需要它的膨胀)是启动时大约64MB的惩罚和半高级功能的另一个120MB,这仍然是巨大的,当然GC将继续增加更多。

这必须立即杀死CPU及其周围的所有外围设备。现在想象一切都在那个,所有应用程序,以及整个操作系统和堆栈上运行(因为VS2010肯定会尝试朝这个方向移动)。

我会说:欢迎使用现代的英国式臃肿狂热方式及其易用性。无论你做什么,你都会花更多的时间找到解决方法,然后遵循一些“通用”框架,以快速,酷,风格和可定制的应用程序。当然WPF在纸面上是好的,但在任何实际使用中浪费资源(大量的资源和陡峭的学习曲线)。

他们说它过去了,现在仍然是未来(JDK应用也是如此普遍)。

简单地说N.U.T.S +最优秀的例子,它不是关于速度(因为CLR防御者将通过简单的例子进入)托管代码。它与每个GC和对象根环境一样,具有巨大的可伸缩性和机器清除能力。

投下来......去找门徒,你知道你想要。

(并写信给奥巴马反对二氧化碳排放不会发生;如果这个潮流继续前进,可能会乘以1003120x。即使是Cray Jaguar也不会在未来20年内随时运行这种运营环境)。

答案 2 :(得分:3)

您可以使用

WPF Performance Suite

Optimizing WPF Application Performance

类似的问题困扰着我...... (something like)

在应用程序启动时,我查询数据库并检索要在ListBox中显示的所有员工和相关信息。这一直保存在记忆中。

您可以修改代码以遵循WPF: Data Virtualization

答案 3 :(得分:1)

它似乎真的是内存泄漏。可能,DataTemplate中的一些UI元素会保留对其他对象的引用,即使在UI元素被销毁时也应该保持活动状态。

Image控件可能存在一些内存泄漏。尝试从模板中删除它并查看结果。此外,您是否订阅了控件'加载事件或类似事件中的任何事件?

只是猜测一下......正如人们已经在这里说过的那样,你可能真的想用性能和内存分析器来看你的应用程序。

答案 4 :(得分:0)

我注意到在看似无害的情况下WPF和.NET 3.5 SP1 w.r.t内存问题存在一些问题。

我确实找到了一些资源,但我不确定它们会对你有所帮助:

http://blog.ramondeklein.nl/?p=58

该博客文章描述了

时的情况
  
      
  1. 样式在应用程序的ResourceDictionary中定义。
  2.   
  3. 该样式使用使用媒体效果的控件模板(即   DropShadowEffect)。
  4.   
  5. 应使用StaticResource
  6. 引用媒体效果   

简而言之,我认为您的解决方案是确保任何媒体效果(阴影等)都使用静态资源。

答案 5 :(得分:0)

对我有很大帮助的一件事是使用包装Stream类的类。详细解释了here,我确实通过使用这种方法节省了大量内存。 WPF确实保留了对每个图片的底层byte []和流的引用。