我正在检查 WPF 应用程序以查找内存泄漏(使用 ANTS Memory Profiler 5.1),并且我不断看到一些页面和控件在不应该占用的情况下占用了内存。
因此,我转到对象保留图,看看是什么让它们保留在周围,我在每个页面上都看到了这一点:
对象保留图 http://img683.imageshack.us/img683/3013/ants.jpg
问题是,我在每个页面上都将 KeepAlive 设置为 false,并且我认为用户控件上不存在这样的属性。
谁能告诉我我应该寻找什么?这到底是内存泄漏还是 WPF 应用程序的正常行为?
是的,根据您提供的信息,您存在内存泄漏。当您找到引用链并且它不在您的代码中时,最简单的方法是...... Reflector。
图片说:JournalEntryKeepAlive._keepAliveRoot
字段保存对象的引用。让我们进入 Reflector 看看这个家伙是如何迷上我们的对象的。
这次很容易,所有的痕迹都通向NavigationService.MakeJournalEntry()
函数,然后到NavigationService.IsContentKeepAlive()
。这里是:
internal bool IsContentKeepAlive()
{
bool keepAlive = true;
DependencyObject dependencyObject = this._bp as DependencyObject;
if (dependencyObject != null)
{
keepAlive = JournalEntry.GetKeepAlive(dependencyObject);
if (!keepAlive)
{
PageFunctionBase base2 = dependencyObject as PageFunctionBase;
bool flag2 = !this.CanReloadFromUri;
if ((base2 == null) && flag2)
{
keepAlive = true;
}
}
}
return keepAlive;
}
现在你知道规则了。如果满足以下条件,则对象将保留在内存中:
- 它不是一个依赖对象;
- 附加属性 JournalEntry.KeepAlive 为 true;
- 它不是 PageFunction,并且无法从 Uri 重新加载。
经过这项调查后,可能值得阅读更多有关日志条目.KeepAliveMSDN 上的属性。
这个策略帮助我找到了很多与记忆相关的昆虫。希望它也对你有帮助:)。
PS:如果您在查找此特定泄漏时仍然遇到问题,您可以粘贴最小的代码示例,以便我们重现它并为您提供更正确的答案。
干杯,
安瓦卡
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)