【发布时间】:2011-09-30 13:06:40
【问题描述】:
我问这个问题是出于后代的原因和普遍的兴趣。几年前,我注意到 Windows 中有一个奇怪的行为。我知道这适用于 XP,当时它也适用于 Windows 2000 甚至 98,我认为这种行为仍然适用于 Windows 7。
要设置我的问题,请按照以下步骤尝试此实验。
- 打开任务管理器并导航到“进程”选项卡。
- 打开一个您知道会消耗大量内存的应用程序(Web 浏览器应该可以正常工作)并在任务管理器中找到该进程。
- 现在通过打开窗口、文档、网页等来使用应用程序,直到应用程序的内存使用量显着增长。
- 记下应用程序的内存使用情况并最小化应用程序 - 您应该会看到应用程序使用的内存量显着减少。
- 最后,恢复应用程序。
恢复 Window 后,您应该确保应用程序的内存使用量应该会稍微飙升,但不会像最小化应用程序之前那样接近。这与任何基于 GUI 的应用程序都非常一致,但对于大型应用程序来说肯定更深刻。
问题
在操作系统内部,正在发生什么进程来强制进行这种(假定的)垃圾收集?此外,通过 COM 或一些 .Net 调用,有没有办法在不最小化应用程序的情况下强制执行此过程?如果有,请提供源代码。语言无关紧要。
如果您像我一样,您可能会同时打开许多应用程序。内存使用量可能会上升...上升...上升..在不知不觉中,您需要关闭一些应用程序以释放资源。如果我至少可以集成到软件中,我可以控制一种机制来强制从操作系统收集垃圾,类似于上面练习中的行为,那就太好了。
我知道在 .Net 中有一个 GC 对象,您可以根据需要调用垃圾清理。然而,它似乎与最小化应用程序时发生的内存清理的性质无关。
我希望这是一个令人头疼的问题,并且在多年的好奇之后,有人可以给我一个很好的技术解释。
页面文件和进一步深入“兔子洞”
Kragen 和 Alex K 已发布了有趣的内容作为对这个问题的回答。在阅读了他们都发布的 Knowledge Base article 后,我发现还有一种方法可以防止这种行为的发生。有哪些示例说明您何时希望阻止这种分页释放?我正在尝试通读文档以尽可能多地了解这一点。很多这些信息对我来说都是新的,因为我从来不需要在 .Net 应用程序中实现任何这些信息。考虑一个用例可以帮助我理解为什么以及何时要避免这种行为的原因。
【问题讨论】:
-
大多数应用程序(我知道 Firefox)在窗口最小化时需要时间来清理,因为它不会干扰用户。您尝试过哪些应用程序?你确定这是操作系统级别的事情吗?
-
“内存使用”这个词不是很精确。您是指工作集、虚拟地址空间的大小、私有字节还是什么?
-
@Earlz-- 这似乎与每个应用程序(MS Word、Access、Excel、Web 浏览器、设计环境等)都非常一致,所以我认为这是通过 Windows 系统调用发生的当应用程序最小化时内核会触发。
-
@John Saunders——我不确定如何回答你的问题。我能说的最好的就是“某事”一直在发生,对于几乎每个基于 GUI 的应用程序,当它被最小化时。每次最小化已打开并使用至少几分钟的应用程序时,您都会看到“内存使用量”减少。有时使用量下降只是很小的百分比,有时是相当剧烈的。但是,在初始最小化之前,我从未见过内存使用量飙升至全部量。
-
@RLH:如果您的意思是任务管理器显示的“内存使用情况”,那么可能只有任务管理器在改变?
标签: .net windows com windows-7 windows-xp