在我的机器(XP,64)上,ASP.net 工作进程(w3wp.exe)总是在启动时保留 5.5GB 的虚拟内存。无论它托管的 Web 应用程序如何(它可以是任何东西,甚至是 aspx 中的空网页),都会发生这种情况。
这个大的旧虚拟内存块在进程开始时被保留,所以这不是某种逐渐的内存“泄漏”。
对windbg 的一些窥探表明,内存问题是Private、Reserved 和RegionUsageIsVAD,这表明它可能是调用VirtualAlloc 的人的工作。它还表明,有问题的内存被分配/保留为 4 个大块,每个 1GB 和几个较小的块(每个 1/4GB)。
所以我想我需要弄清楚谁在调用 VirtualAlloc 并保留所有这些内存。我怎么做?
在分配内存之前将调试器附加到进程是很棘手的,因为 w3wp.exe 是由 svchost.exe(即 IIS/ASP.Net 过滤器)启动的进程,如果我尝试自己启动它以调试它它只是在没有所有这些大量内存保留的情况下关闭。此外,如果我重用它们,命令行参数是无效的(这是有道理的,因为它是由调用进程创建的管道)。
我可以在事后将它附加到进程中(这就是我找到有问题的内存区域的方式),但我不确定当时是否有可能确定谁分配了什么。