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}

所以在这个“渲染”方法中,它分配了大约 520 字节的内存,据我所知,它并没有释放它。

我还可以看到一个名为的方法或类

SDBitmapCreate

也在泄漏内存。

很有趣,因为我似乎找到了一些东西,但我不确定是什么。

还有其他建议吗?

谢谢。

4

4 回答 4

6

这里有一个很好的解决 Silverlight 内存泄漏的教程:http: //davybrion.com/blog/2009/08/finding-memory-leaks-in-silverlight-with-windbg/。这很复杂,您必须处理 WinDBG 命令,但我发现它在过去很有帮助。当然,这并不能具体回答您的问题,但它可能会为您指明正确的方向。

于 2010-12-14T01:00:27.317 回答
4

首先,我不知道有任何用于 silverlight 的内存泄漏工具。

几周前,我经历了我认为的内存泄漏问题。原来我的 Silverlight 应用程序在画布中有流氓孩子。

我的问题可能不是你的问题,但它可能会让你思考。

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

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

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

祝你好运。

于 2010-12-09T22:34:07.613 回答
2

关于 Xaml 中的内联 DataTemplates 存在官方内存泄漏。您可以在此处阅读有关它的主题:http ://forums.silverlight.net/forums/t/171739.aspx 。

Microsoft 已经发布了一个服务版本(更新版本是 4.0.50826.0),应该可以解决这个问题:http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1。 aspx

如果服务版本修复(某些)您的问题,请记住更新主机 html 文件中的最低版本。

于 2010-12-15T07:05:15.013 回答
1

如果我处于您的情况,我会尝试创建一个简单的测试应用程序来演示泄漏,只是为了仔细检查它在您的实际代码之外是否可重复。这证明它不是您的代码中的一个细微错误。然后,我会将测试应用程序发布到由 MS 人员监控的 MS Silverlight 论坛。如果您订阅了 MSDN,或者您的公司与 MS 签订了支持协议,我也会向 MS 开一张“票”(忘记他们实际称呼他们的名字)。

于 2010-12-20T12:37:57.173 回答