【问题标题】:Silverlight 4 seems like starving of memorySilverlight 4 似乎内存不足
【发布时间】:2010-05-03 21:52:59
【问题描述】:

我一直在使用 Silverlight 并尝试将我的 Silverlight 3.0 应用程序移植到 Silverlight 4.0。 我的应用程序加载不同的 XAP 文件,并根据用户请求创建 Xaml 用户控件的实例并将其添加到主容器中,以一种 MEF 方法,以便我可以拥有可扩展和可插入的应用程序。

该应用程序非常庞大,为了保持可接受的性能和初始加载,我构建了一些帮助类来在后台加载所有页面和用户控件,以便以后使用。

到目前为止,在 Silverlight 3.0 上,一切运行顺利,没有任何问题。 切换到 SL 4.0 我注意到当流程接近创建用户控件的实例时,布局会意外冻结一分钟,有时甚至更长时间。查看任务管理器,IE 的内存使用量从 50MB 跃升至 400MB,有时甚至高达 1.5 GB。

如果该过程不会占用那么多,即使内存使用量仍然非常高,布局也会正确呈现。否则一切都会因为内存不足异常而崩溃。

运行在 SL3 中编译的相同应用程序,加载所有用户控件时使用的内存约为 200MB。在 SL3 中加载应用程序所花费的时间大约为 10 秒,而在 SL4 中最多需要 3 分钟。布局中没有透明度,没有设置不透明度,也没有效果和动画。

当用户从一个屏幕切换到另一个屏幕时,用户控件会即时实例化并有意在可视化树中添加或删除。当从可视化树中移除用户控件以允许 GC 在后台运行时,所有资源都会被正确清理。

我可能做错了什么,但我无法弄清楚这个问题的根源到底在哪里。据我所知,SL4 中没有内存分析器可以帮助我找到查看的位置。但同样,我无法更新可用的新调试工具。

【问题讨论】:

    标签: silverlight silverlight-4.0 memory-management


    【解决方案1】:

    更新:

    用于修复内存泄漏的 Silverlight 4 服务版本:http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1.aspx

    Silverlight 4 已知内存泄漏,目前正在测试修复。

    这是一个关于它的 Microsoft Thread:

    用户“heuertk”是 Microsoft Silverlight 开发人员......他解释了问题和修复状态......

    http://forums.silverlight.net/forums/t/171739.aspx

    【讨论】:

      【解决方案2】:

      老实说,尽管您断言“当从可视化树中删除用户控件时,所有资源都已正确清理”,这是我开始寻找的地方。它确实闻到了 UserControls 元素没有被正确释放的味道。

      这通常发生在有长寿命(例如静态)对象引发更多瞬态对象附加到的事件时。如果这些事件处理程序没有分离,它会使这些对象在内存中徘徊。

      【讨论】:

      • 确实可能是一个警告,但为了避免错过未发布的事件可能引发任何问题,我没有使用您建议的任何类型的事件。相反,我实现了前摄器模式的派生(不常用)。有一个线程在后台运行,它在整个应用程序和可插入的 xaps 中为订阅它的任何用户控件中继消息,并通过实现的类属性过滤消息类型。所有的布局事件,例如点击和用户控件通知都被释放。
      • 在初始加载应用程序的场景中,所有用户控件都添加到可视化树中,不包括任何用户交互,因此不需要释放资源,SL 使用相同数量的内存。更明确地说,如果应用程序从实现我通常在其生命周期中添加的所有用户控件开始,SL4 使用的内存量仍然在 1.6 GB 左右。这应该排除任何内存释放问题,因为不需要删除任何对象。
      • 我会的,无论如何都要检查所有订阅用户事件的类,即使我遇到的问题,我相信,它与这个阶段无关。在编译应用程序之前将所有用户控件添加到 XAML 时,SL4 在加载后执行应用程序所花费的时间在 3/4 分钟的范围内。同时布局完全冻结。这些图形行为将我指向 UIThread,我想它需要大量资源。
      【解决方案3】:

      我一直在测试,并想分享我到目前为止的发现。 了解 SL4 的行为可能会有所帮助。

      由于听起来很奇怪,UIThread 渲染一堆图形组件可能需要很长时间,并且考虑到 Microsoft 已经改进了渲染管道,我已将我的解决方案恢复为 SL3,但我一直在我的本地主机上安装 SL4。

      该应用程序使用 RIA 服务并且来回移动到 SL4 意味着我必须根据已发布的文档对代码进行一些更改。

      与使用 Visual Studio 2008 测试时相比,该应用程序运行得非常流畅。内存使用率低于未安装 SL4 之前的情况。

      当我切换到 VS2010 时,情况就完全不同了。内存无限增长,布局捕捉用户交互的速度很慢,有时它会像之前解释的那样冻结。

      我已通过使用标准 Rest 服务禁用 RIA 服务,并且该过程的质量没有改变。

      总之,考虑到我将继续测试,以便最终了解真正阻止应用程序以可接受的模式运行的原因,我相信内存问题是由于 VS 2010 的调试过程或 VS 的组合造成的2010 和 SL4

      【讨论】:

        【解决方案4】:

        仅供参考:在 Silverlight 4.0 中使用 Silverlight 工具包图表时存在内存泄漏。这是一个已知错误,Microsoft 正在努力解决。

        【讨论】:

          【解决方案5】:

          Silverlight 4 无处不在。它不能正确释放内存。

          【讨论】:

            猜你喜欢
            • 2018-09-30
            • 1970-01-01
            • 2017-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-01
            • 2017-08-03
            • 1970-01-01
            相关资源
            最近更新 更多