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

RLH*_*RLH 3 .net windows com windows-xp windows-7

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

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

  1. 打开任务管理器并导航到"进程"选项卡.
  2. 打开您使用的知道消耗大量内存的应用程序(Web浏览器应该可以正常工作)并在任务管理器中找到该过程.
  3. 现在通过打开窗口,文档,网页等来使用该应用程序,直到应用程序的内存使用量显着增长.
  4. 记下应用程序内存使用情况并最小化应用程序 - 您应该看到应用程序使用的内存量显着减少.
  5. 最后,恢复应用程序.

恢复窗口之后,您应该确定应用程序的内存使用量应该会略微增加,但不会像最小化应用程序之前那样接近.这与任何基于GUI的应用程序非常一致,但对于更大的应用程序来说肯定更为深刻.

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

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

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

我希望这是一个令人头疼的问题,经过多年的好奇,有人可以给我一个很好的,技术性的解释.

页面文件和更进一步的"兔子洞"

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

Jus*_*tin 7

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

有关更多信息,请参阅以下链接:

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


Ale*_* K. 6

最小化窗口可能导致窗口修剪该进程的工作集,以利于剩余的前台应用程序(通过调用完成 SetProcessWorkingSetSize()).