Windows操作系统和内存pipe理 – 应用程序最小化时会发生什么?

我为这个问题提出了后代的原因和普遍的兴趣。 几年前,我注意到Windows中的一个奇怪的行为。 我知道这在XP中工作,当时它也在Windows 2000甚至98,我会认为这种行为仍然适用于Windows 7。

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

  1. 打开任务pipe理器并导航到进程选项卡。
  2. 打开你使用的应用程序,你知道消耗相当数量的内存(一个Web浏览器应该工作正常),并在任务pipe理器中find该过程。
  3. 现在通过打开窗口,文档,网页等来使用应用程序,直到应用程序的内存使用量显着增长。
  4. 记下应用程序的内存使用情况,并最小化应用程序 – 应用程序正在使用的内存量将显着减less。
  5. 最后,恢复应用程序。

在恢复窗口之后,应该确保应用程序的内存使用量应该稍微高一点,但不要超过最小化应用程序之前的位置。 这与任何基于GUI的应用程序都非常一致,但是对于更大的应用程序来说,它肯定更加深刻

在操作系统内部,发生什么过程迫使这个(假设的)垃圾回收发生? 而且,通过COM或者一些.Net调用,有一种方法可以在不最小化应用程序的情况下强制这个过程? 如果是这样,请提供源代码。 语言并不重要。

如果你像我一样,你可能会同时打开很多应用程序。 内存使用可以爬起来……在你知道它之前,你需要closures几个应用程序来释放资源。 如果我至less可以将软件集成到我已经控制一个机制来强制从操作系统中进行垃圾收集,那就好了。

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

我希望这是一个令人头疼的问题,在多年的好奇心之后,有人可以给我一个很好的技术解释。

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

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

Solutions Collecting From Web of "Windows操作系统和内存pipe理 – 应用程序最小化时会发生什么?"

你看到的进程不是垃圾收集 – Windows正在“修剪工作集”(即分页尽可能多的内存,因为它可以磁盘),以释放前台应用程序的内存。

请参阅以下链接了解更多信息:

  • 当顶层窗口最小化时,应用程序的工作集被修剪(KB)
  • SetProcessWorkingSetSize函数

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

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