gpt4 book ai didi

.net - 我的 WPF 导航中是否存在内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 12:12:55 25 4
gpt4 key购买 nike

我正在查看 WPF 应用程序以查找内存泄漏(使用 ANTS Memory Profiler 5.1),并且我一直看到一些页面和控件在不应该占用内存时占用了内存。

所以我转到对象保留图并查看是什么让它们保留下来,并且我一直在每个页面上看到这一点:

Object Retention Graph http://img683.imageshack.us/img683/3013/ants.jpg

问题是,我在每个页面上都将 KeepAlive 设置为 false,并且我认为用户控件上不存在这样的属性。

谁能告诉我我应该寻找什么?这甚至是内存泄漏还是 WPF 应用程序的正常行为?

最佳答案

是的,根据您提供的信息,您存在内存泄漏。当您找到引用链并且它不在您的代码中时,最简单的方法是......反射器。

图片说:JournalEntryKeepAlive._keepAliveRoot字段保存对对象的引用。让我们进入 Reflector 看看这个家伙是如何与我们的对象 Hook 的。

这次很简单,所有痕迹都指向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 重新加载。

  • 在这次调查之后,可能值得阅读更多关于 JournalEntry.KeepAlive 的信息。 MSDN 上的属性。

    这个策略帮助我找到了许多与内存有关的昆虫。希望它也能帮助你:)。

    PS:如果您在查找此特定泄漏时一直遇到问题,您可以粘贴最少的代码示例供我们重现它并为您提供更正确的答案。

    干杯,
    安瓦卡

    关于.net - 我的 WPF 导航中是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1925052/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com