【问题标题】:Memory leak when removing view from region从区域中删除视图时内存泄漏
【发布时间】:2013-04-19 17:39:22
【问题描述】:

我创建了可以使用 PRISM MEF 选择区域内不同游戏的游戏管理器。 “MainRegion”中有静态外壳和动态内容。每个游戏都是独立的模块(组件),当我获得实例时,它为每个游戏分配了大约 20-30 MB。

每个游戏我都有这样的组件:

  • 主视图 [CreationPolicy.Shared]
    • View1 [CreationPolicy.Shared]
    • ViewN [CreationPolicy.Shared]
  • MainViewModel [CreationPolicy.Shared]
    • ViewModel1 [CreationPolicy.Shared]
    • ViewModelN [CreationPolicy.Shared]

通过调用创建的每个“视图”(main、1st、2nd...)

_serviceLocator.GetInstance<MainView>();

每个“视图”都有以下属性

[Import(AllowRecomposition = false)]
public MainViewModel ViewModel //example for MainView
{
    get { return this.DataContext as MainViewModel; }
    set { this.DataContext = value; }
}

当我想改变游戏时,我从MainRegion 中删除了MainView,但它不会创建新实例,因为PartCreationPolicy 设置为Shared,但如果我使用NonShared 它有内存删除实例后泄漏。

如何在我的应用程序中修复此内存泄漏?

【问题讨论】:

  • 内存泄漏是什么意思?是您删除了它并且实例没有被破坏还是?
  • instance destoryed,但 TaskManager 显示使用的内存没有减少,所以如果我在应用程序使用 50 MB 内存时选择游戏,但如果我选择游戏更多次(去到菜单-选择游戏-转到菜单-选择游戏-...-...-等等)它会“吃掉”越来越多的内存

标签: .net wpf mvvm prism mef


【解决方案1】:

解决泄漏的关键是首先通过使用内存分析器了解它,并确定对象保存在内存中的原因以及哪个对象持有对它们的引用。

由于您没有在问题中提供此类信息,我将指出导致此泄漏的一个非常可能的原因是您的对象实现了IDisposable。 MEF 保留对一次性对象的引用而不释放它们存在一个已知问题。如果确实如此,您可以查看此问题以获取更多详细信息和可能的解决方案:MEF keeps reference of NonShared IDisposable parts, not allowing them to be collected by GC。另一种可能性是您的一个导入配置为允许重组 - 在这种情况下,MEF 还将保留对您的对象的引用。

您还应该记住,GC 仅在需要时执行垃圾收集,而不必在您删除实例后立即执行。您可以自己调用垃圾收集器以确保对象确实保存在内存中:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

如果您的对象不是一次性的并且没有允许重组的导入,那么您自己的代码很可能会保留对它们的引用,并且您必须分析您的应用程序以找出是谁。为此,我建议使用ANTS Memory Profiler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多