gpt4 book ai didi

c# - WPF 窗口在关闭后不释放内存

转载 作者:太空狗 更新时间:2023-10-29 23:53:42 26 4
gpt4 key购买 nike

我创建了一个测试代码:

private void Application_Startup_1(object sender, StartupEventArgs e)
{
ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
MainWindow window = new MainWindow();
window.Show();
window.Close();
window = null;
GC.Collect();
}

MainWindow 是由 Visual Studio 自动创建的窗口,我没有向其中添加任何代码。在“MainWindow window = new MainWindow();”这一行之前,应用程序占用了4M内存。打开窗口就变成了13M。 即使我们关闭窗口并调用 GC.Collect() 也不会改变

这些额外的内存有什么用,我们如何释放它们?

最佳答案

您的测试代码有缺陷,请参阅 here征求我对几乎相同场景的评论。

你的有点简单,但同样的评论适用:

  • 将变量设置为 null 并调用 GC.Collect 是不够的。允许 JIT 优化您对 window = null; 的分配,因为它可以清楚地看到该变量之后不再使用。此外,堆栈帧的 GC 报告并不准确(相对于您的来源),堆栈上可能存在隐藏的副本。将测试代码移动到您返回的单独方法中,以确保没有对 MainWindow 的引用留在堆栈中。 (在修复下一点后技术上没有必要,但我提到它是为了完整性,以便人们在编写 GC 测试时理解这一点。)
  • 您没有给多线程 WPF 渲染引擎时间来清理、关闭和强制 GC 不足以与渲染引擎同步以清理其资源

此外,您的 GC.Collect 调用不足以收集带有终结器的对象,您需要

GC.Collect(); // find finalizable objects
GC.WaitForPendingFinalizers(); // wait until finalizers executed
GC.Collect(); // collect finalized objects

查看链接的帖子以获得更完整的示例,修复它后我无法重现任何泄漏的窗口实例。

What are these extra memory being used for and how can we release them?

除了测试代码中的缺陷之外,通过查看内存消耗,您可能会看到错误的东西。不要单独查看内存,使用可以检查事件对象的调试器工具。 .NET 运行时将预期更多分配并且不会立即将内存返回给操作系统,这不是泄漏,如果运行时不使用未使用的内存,操作系统完全能够分页。仅当您重复该操作继续增长时才会出现泄漏。

关于c# - WPF 窗口在关闭后不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14411154/

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