我问这个问题是出于后人的原因和普遍的兴趣.几年前,我注意到
Windows中有一种奇怪的行为.我知道这适用于XP,当时它也适用于Windows 2000甚至98,我认为这种行为仍适用于Windows 7.
要设置我的问题,请按照以下步骤尝试此实验.
>打开任务管理器并导航到“进程”选项卡.
>打开您使用的知道消耗大量内存的应用程序(Web浏览器应该可以正常工作)并在任务管理器中找到该过程.
>现在通过打开窗口,文档,网页等来使用该应用程序,直到应用程序的内存使用量显着增长.
>记下应用程序内存使用情况并最小化应用程序 – 您应该看到应用程序使用的内存量显着减少.
>最后,恢复应用程序.
在恢复窗口之后,应该确保应用程序的内存使用率应该稍微高一些,但是在最小化应用程序之前没有那么近.这与任何基于GUI的应用程序非常一致,但对于更大的应用程序来说肯定更为深刻.
题
在操作系统内部,正在发生什么过程迫使这个(假设的)垃圾收集发生?此外,通过COM或某些.Net调用有没有办法强制执行此过程而不会最小化应用程序?如果是,请提供源代码.语言并不重要.
如果你像我一样,你可以同时打开很多应用程序.内存使用量可能会上升……升级……在您知道之前,您需要关闭一些应用程序以释放资源.如果我至少可以集成到我控制了一种机制来强制从操作系统中进行垃圾收集的软件,那将是很好的,类似于上述练习中的行为.
我知道在.Net中有一个GC对象,您可以根据需要调用垃圾清理.但是,它似乎与应用程序最小化时发生的内存清理的性质有关.
我希望这是一个令人头疼的问题,经过多年的好奇,有人可以给我一个很好的,技术性的解释.
页面文件和更进一步的“兔子洞”
Kragen& amp; amp; amp; Alex K.在阅读Knowledge Base article时,他们都发布了,我看到还有一种方法可以防止这种情况发生.有什么时候可以阻止这种分页的发生?我正在尝试阅读文档,尽可能多地了解这一点.很多这些信息对我来说都是新的,因为我从来不需要在.Net应用程序中实现任何这些信息.考虑一个用例可以帮助我理解为什么以及何时我想避免这种行为的原因.
解决方法
您正在看到的过程不是垃圾收集 – Windows正在“修剪工作集”(即,尽可能多地分配内存到磁盘)以释放前台应用程序的内存.
有关更多信息,请参阅以下链接:
> The working set of an application is trimmed when its top-level window is minimized (KB)
> SetProcessWorkingSetSize Function
上面链接的知识库文章描述了如何防止这种情况自动发生(通过拦截WM_SYSCOMMAND命令),以及如何在任何时候显式导致这种情况发生(通过调用SetProcessWorkingSetSize).