Silverlight内存泄漏

6
我们有一个相当大的Silverlight 4应用程序。我们正在查找应用程序中的内存泄漏,这已经变成了一项艰巨的任务。
对于那些看过原始帖子的人来说,情况已经完全改变了!
我意识到ANTS内存分析器没有显示正确的内容。那是因为内存泄漏不在托管代码中,而在本地代码中。我确实修复了一些ANTS的问题 - 它是一个用于托管代码内存泄漏的好工具。
所以我找到了这个博客,

http://blogs.msdn.com/b/slperf/archive/2010/08/19/analyzing-silverlight-memory-usage-part-1-obtaining-measurements.aspx

这很棒。我使用xPerf和xPerfViewer来查看本机堆栈,并发现了我怀疑的内存泄漏。

因此,我可以看到一个堆栈跟踪,看起来像这样:

CCoreServices::Draw
    CCoreServices::Tick
    CUElement::Render
        CUIElement::Render
        CUIElement::RenderWithTransform
        CUIElement::RenderVisual
        CUIElement::RenderChildren
            {Repeat of the above in a recursive fashion}

在这个“Render”方法中,它会分配大约520字节的内存,据我所知它并没有释放。我还看到一个名为的方法或类。
SDBitmapCreate

内存泄漏也是一个问题。

有趣的是,好像我找到了什么,但我并不确定是什么。

还有其他建议吗?

谢谢。


你是如何使用ANT检测内存泄漏的?我所知道的唯一“ANT”(或通过谷歌找到的)是Java构建工具(http://ant.apache.org/)。你指的是这个吗?还是有一些我不知道的Silverlight ANT工具(显然我需要了解)? - Ken Smith
没关系,最终找到了:http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/ - Ken Smith
没错,就是这个。你可以按命名空间进行过滤,通常情况下,如果存在内存泄漏,你会发现自己命名空间中的类正在泄漏。但这里不是这种情况,Silverlight框架中的东西正在泄漏。我确定我们是造成了这个问题,但这使得问题更难以发现和解决。 - peter
你可以使用Deleaker来搜索内存泄漏问题。 - John Smith
4个回答

6

4

首先,我不知道有任何针对Silverlight的内存泄漏工具。

几周前,我遇到了所谓的内存泄漏问题。结果发现我的Silverlight应用程序在画布中有失控的子元素。

我的问题可能不是您的问题,但它可以让您思考一下。

在重新从服务器获取结果填充列表之前,我必须从适当的画布中删除所有子元素。仅清除列表是不够的。

        for (int i = 0; i < boxDataLabel.Count; i++)
        {
            canvaz.Children.Remove((Label)boxDataLabel[i]);
        }
        boxDataLabel.Clear();

boxDataLabel是一种标签类型的列表。

祝你好运。


那么为什么会创建内存泄漏?肯定有某些持续占用内存的东西,你搞清楚具体是什么了吗? - peter

2

九月份的更新修复了一些问题,但并非全部。Silverlight团队目前正在测试一个修复方案,希望能很快发布。 - Henrik Söderlund

1

如果我处在你的情况下,我会尝试创建一个简单的测试应用程序来演示内存泄漏,以确保它在实际代码之外是可重复的。这证明了它不是你代码中微妙的错误。然后,我会将测试应用程序发布到MS Silverlight论坛上,该论坛由微软人员监控。如果你有MSDN订阅,或者你的公司与微软有支持协议,我也会向微软开放一个“工单”(忘记他们实际上叫什么了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接