背景:
我一直在监控应用程序中使用2009年11月发布的Silverlight Toolkit Charting组件,该应用程序每10秒左右更新一次折线图。
每个图表都绑定到ObservableCollection。 DataValuePair是仅包含两个属性(DateTime和int)的简单类。每次向集合添加DataValuePair时,都会删除已经过某个时间点的项目(即每个集合中始终有< 50个DataValuePair对象)。
问题:
记忆力不断上升。在WinDbg中,我可以看到DataValuePair对象(甚至是已从ObservableCollections中删除的对象)仍在堆中,并且由图表组件的某些元素引用。
我的应用程序代码中没有对象的其他引用,并且通过.Remove(item)从ObservableCollections中删除对象。我认为这些将被GC删除。
任何人都可以看到我在某处出错或者这是图表组件的问题吗?
干杯! 克里斯
答案 0 :(得分:2)
是的,经过两天的努力,我似乎已经解决了这个问题!
似乎内存泄漏是由LineDataPoints上的样式引起的,我已经改变了这一点:
<Style x:Key="SparklineDataPointStyle" TargetType="charting:LineDataPoint">
<Setter Property="Template" Value="{x:Null}" />
<Setter Property="Background" Value="LimeGreen" />
</Style>
到此:
<Style x:Key="SparklineDataPointStyle" TargetType="charting:LineDataPoint">
<Setter Property="Background" Value="LimeGreen" />
</Style>
即,删除先前设置为null的模板设置器。
我不太清楚为什么会这样,但我会调查。
答案 1 :(得分:1)
要调查内存使用问题,可以使用ANTS内存分析器。 我认为它比WinDbg更有用,它显示了每种类型的实例数,并显示了类之间的一些关系图。我的意思是他们是如何联系的。