.net 从区域中删除视图时内存泄漏
我创建了游戏管理器,它可以使用PRISM MEF在该地区选择不同的游戏。“MainRegion”中有一个静态外壳和动态内容。每个游戏都是独立的模块(组件),当我获得实例时,每个游戏大约分配20-30MB 每个游戏我都有这样的组件:.net 从区域中删除视图时内存泄漏,.net,wpf,mvvm,prism,mef,.net,Wpf,Mvvm,Prism,Mef,我创建了游戏管理器,它可以使用PRISM MEF在该地区选择不同的游戏。“MainRegion”中有一个静态外壳和动态内容。每个游戏都是独立的模块(组件),当我获得实例时,每个游戏大约分配20-30MB 每个游戏我都有这样的组件: MainView[CreationPolicy.Shared] 视图1[CreationPolicy.Shared] ViewN[CreationPolicy.Shared] MainViewModel[CreationPolicy.Shared] Vie
- MainView[CreationPolicy.Shared]
- 视图1[CreationPolicy.Shared]
- ViewN[CreationPolicy.Shared]
- MainViewModel[CreationPolicy.Shared]
- ViewModel1[CreationPolicy.Shared]
- ViewModelN[CreationPolicy.Shared]
_serviceLocator.GetInstance<MainView>();
当我想更改游戏时,我从MainRegion
中删除MainView
,但它不会创建新实例,因为PartCreationPolicy
设置为Shared
,但如果我使用NonShared
则在删除实例后会出现内存泄漏
如何在我的应用程序中修复此内存泄漏?解决此泄漏的关键是首先使用内存探查器了解它,并确定对象保留在内存中的原因以及哪个对象持有对它们的引用 由于您没有在问题中提供此类信息,我将指出导致此泄漏的一个非常可能的原因是您的对象实现了
IDisposable
。MEF存在一个已知的问题,即保留对一次性物品的引用而不释放它们。如果确实如此,您可以查看此问题以了解更多详细信息和可能的解决方案:。另一种可能性是,您的一个导入被配置为允许重新编译——在这种情况下,MEF还将保留对您的对象的引用
您还应该记住,GC仅在需要时执行垃圾收集,而不一定在删除实例之后立即执行。您可以自己调用垃圾收集器,以确保对象确实保存在内存中:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
如果您的对象不是一次性的,并且没有允许重新编译的导入,那么对它们的引用很可能由您自己的代码保存,并且您必须分析您的应用程序,以确定由谁创建。为此,我建议使用。你说它有内存泄漏是什么意思?是您删除了它,实例没有被破坏还是被破坏?实例被破坏了,但TaskManager告诉我使用的内存没有减少,所以如果我选择一次游戏,应用程序使用50 MB内存,但如果我选择游戏更多次(进入菜单选择游戏进入菜单选择游戏-…-…-等等),它将“吃”越来越多的内存
[Import(AllowRecomposition = false)]
public MainViewModel ViewModel //example for MainView
{
get { return this.DataContext as MainViewModel; }
set { this.DataContext = value; }
}