【问题标题】:Memory leak in silverlight prism/unitysilverlight prism/unity中的内存泄漏
【发布时间】:2011-02-01 14:48:29
【问题描述】:

我们正在使用 SL4、PRISM 和 MVVM 构建一个 LOB 应用程序。我最近注意到我的应用程序没有释放任何内存。它从大约 150MB 开始,如果我切换黑白页面,它会很快增长到 1GB+。我们的设计涉及 3 个模块,每个模块都有一个 Controller 类(Unity 单例),它监听事件并将视图注入适当的区域。因此,当触发事件以注入视图时,这些控制器中会发生这种情况。

var v = Container.resolve<view>()
var vm = Container.resolve<viewmodel>()
v.datacontext = vm;
myregion.addtoregion(v);

因此对该视图的 100 次调用将执行 100 次。在 addviewregion 方法中,我在添加新视图之前删除了所有现有视图。在看到内存问题后,我在 addviewtoregion 方法中将 view 和 viewmodel 都设置为 null,以便删除所有需要删除的视图。仍然内存消耗是相同的。 Unity ContainerControllled... 对象(我的控制器)是否持有对这些对象的引用?

【问题讨论】:

    标签: silverlight mvvm unity-container prism


    【解决方案1】:

    您是否正在注册以处理这些动态视图上的事件而忘记在删除视图之前取消注册它们?处理事件会创建对对象的隐式引用,这通常是托管内存泄漏的来源。

    您应该查看 this guide 以使用 WinDbg 检查堆和 GC 根来跟踪泄漏的 Silverlight 控件。

    【讨论】:

    • 这是一个可能的原因。您应该对事件聚合器事件使用弱事件处理
    • 看起来统一解析的对象没有被垃圾收集,或者我的容器配置有问题。我用以下代码进行了测试:
    • WeakReference ref1 = new WeakReference(Container.Resolve
      ()); WeakReference ref2 = new WeakReference(new Footer()); GC.Collect(); GC.WaitForPendingFinalizers(); bool isRef1Alive = ref1.IsAlive; bool isRef2Alive = ref2.IsAlive;页脚是一个用户控件,这里第一个返回 true,而第二个返回 false。 Container 是否包含对其解析的项目的任何引用?顺便说一句,我没有这个视图的任何接口。我添加了 Container.RegisterType
      ();在引导程序(ConfigureContainer 方法)中。结果还是一样。
    • 据我了解弱引用当你认为它们应该被收集但当 GC 认为引用的内存被使用时,它们不会被垃圾收集。只要不再使用 Unity 对象,它们就会被垃圾回收。
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多