Windows操作系统和内存管理 - 应用程序最小化后会发生什么?

时间:2011-07-07 14:44:08

标签: .net windows com windows-7 windows-xp

我问这个问题是出于后人的原因和普遍的兴趣。几年前,我注意到Windows中有一种奇怪的行为。我知道这可以在XP中运行,那时它也适用于Windows 2000甚至98,我认为这种行为仍适用于Windows 7。

要设置我的问题,请按照以下步骤尝试此实验。

  1. 打开“任务管理器”并导航到“进程”选项卡。
  2. 打开您使用的知道消耗大量内存的应用程序(Web浏览器应该可以正常工作)并在任务管理器中找到该过程。
  3. 现在通过打开窗口,文档,网页等来使用该应用程序,直到应用程序的内存使用量显着增长。
  4. 记下应用程序内存使用情况并最小化应用程序 - 您应该会看到应用程序正在使用的内存量显着减少。
  5. 最后,恢复应用程序。
  6. 恢复窗口之后,您应该确定应用程序的内存使用率应该稍微高一点,但不会像应用程序最小化之前那样接近。这与任何基于GUI的应用程序非常一致,但对于更大的应用程序来说肯定更为深远。

    问题

    在操作系统内部,正在发生什么过程强制进行此(假定的)垃圾收集?此外,通过COM或某些.Net调用有没有办法强制执行此过程而不会最小化应用程序?如果是,请提供源代码。语言并不重要。

    如果你像我一样,你可以同时打开很多应用程序。内存使用量可能会上升......升级......在您知道之前,您需要关闭一些应用程序以释放资源。如果我至少可以集成到我控制了一种机制来强制从操作系统中进行垃圾收集的软件,那将是很好的,类似于上述练习中的行为。

    我知道在.Net中有一个GC对象,您可以根据需要调用垃圾清理。但是,它似乎与应用程序最小化时发生的内存清理的性质有关。

    我希望这是一个令人头疼的问题,经过多年的好奇,有人可以给我一个关于正在发生的事情的良好技术解释。

    页面文件并进一步深入“兔子洞”

    有趣的东西已被贴出来作为Kragen&的这个问题的答案。 Alex K.在阅读他们发布的Knowledge Base article时,我发现还有一种方法可以防止这种情况发生。有什么时候可以阻止这种分页的发生?我正在尝试阅读文档,尽可能多地了解这一点。很多这些信息对我来说都是新的,因为我从来不需要在.Net应用程序中实现任何这些信息。考虑一个用例可以帮助我理解为什么以及何时我想避免这种行为的原因。

2 个答案:

答案 0 :(得分:7)

您正在看到的过程是垃圾收集 - Windows正在“修剪工作集”(即尽可能多地分配内存到磁盘)以释放前台应用程序的内存。

有关详细信息,请参阅以下链接:

上面链接的知识库文章介绍了如何防止这种情况自动发生(通过拦截WM_SYSCOMMAND命令),以及如何在任何时候明确导致此情况发生(通过调用SetProcessWorkingSetSize )。

答案 1 :(得分:6)

最小化窗口会导致该进程的trim the working set窗口为剩余的前台应用程序带来好处(通过调用SetProcessWorkingSetSize()完成)。