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

3
我询问这个问题是为了记录和一般的兴趣。多年前,我注意到Windows中存在一种奇怪的行为。我知道这在XP中有效,那时它也适用于Windows 2000甚至98,我认为这种行为仍然适用于Windows 7。
为了设置我的问题,请按照以下步骤尝试这个实验。
1.打开任务管理器并导航到进程选项卡。 2.打开您使用的应用程序,您知道它消耗了相当多的内存(一个Web浏览器应该可以很好地工作),并在任务管理器中找到该进程。 3.现在使用该应用程序,打开窗口、文档、网页等,直到应用程序的内存使用量显着增加。 4.记下应用程序的内存使用情况,并将应用程序最小化——您应该看到应用程序使用的内存量显着减少。 5.最后,恢复应用程序。
在恢复窗口后,您应该看到应用程序的内存使用量会稍微上升,但远不及在最小化应用程序之前的数量。这与任何基于GUI的应用程序都非常一致,但对于较大的应用程序来说更为显著。
问题:在操作系统内部,发生了什么过程强制进行(假定的)垃圾收集?此外,通过COM或一些.Net调用,是否有一种方法可以在不最小化应用程序的情况下强制执行此过程?如果是,请提供源代码。语言无关紧要。
如果您像我一样,可能会同时打开许多应用程序。内存使用量可能会逐渐增加,然后您需要关闭一些应用程序以释放资源。如果我至少能够将其集成到我控制的软件中,以类似于上述练习的行为强制操作系统进行垃圾收集,那将是很好的。
我知道在.Net中有一个GC对象,您可以随时调用垃圾清理。但是,它似乎与最小化应用程序时发生的内存清理的性质无关。
我希望这是一个令人费解的问题,并且经过多年的好奇心,有人可以给我一个好的技术解释。
页面文件和更深入地进入“兔子洞”
Kragen和Alex K.在回答这个问题时发表了一些有趣的东西。阅读他们发表的知识库文章后,我发现也可以通过一种方式来防止发生这种行为。什么情况下您想要防止此分页释放发生?我正在阅读文档,尽可能多地了解这方面的知识。这里有很多对我来说是新信息,因为我从未需要在.Net应用程序中实现任何内容。考虑一个使用案例将帮助我理解为什么以及何时我会想要避免这种行为。

2
大多数应用程序(我知道Firefox)在窗口最小化时需要一些时间来清理,因为它不会干扰用户。你尝试过哪些应用程序?你确定这是操作系统级别的事情吗? - Earlz
3
“内存使用量”这个术语不是很精确。您是指工作集、虚拟地址空间的大小、私有字节,还是其他什么? - John Saunders
@Earlz-- 这似乎与每个应用程序(MS Word、Access、Excel、Web 浏览器、设计环境等)非常一致,因此我会认为这是通过 Windows 系统调用发生的,内核在应用程序最小化时触发。 - RLH
@John Saunders-- 我不太确定如何回答你的问题。我能说的最好的答案就是,对于几乎所有基于GUI的应用程序,在最小化时都会发生“某些”事情。您可以看到每次最小化至少使用了几分钟的应用程序时,“内存使用量”都会降低。有时使用率下降的百分比很小,有时则相当剧烈。但是,我从未见过内存使用量再次飙升到初始最小化之前的完全金额。 - RLH
@RLH:如果你指的是任务管理器显示的“内存使用情况”,那么可能只有任务管理器在变化? - John Saunders
2个回答

7
您看到的过程不是垃圾收集 - Windows正在“修剪工作集”(即尽可能多地将内存换页到磁盘)以释放前台应用程序的内存。
有关更多信息,请参见以下链接:
上述链接的KB文章描述了如何可以防止自动发生这种情况(通过拦截WM_SYSCOMMAND命令),以及如何随时显式地引起这种情况(通过调用SetProcessWorkingSetSize)。

太棒了!问题在30分钟内解决了!我爱 Stack Overflow!上一次我尝试研究这个行为(大约5年前)时,我无法在任何地方找到答案。这些信息正是我正在寻找的。 - RLH

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接