在我的机器(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过滤器)启动的进程,如果我尝试自己启动它以便调试它它只是关闭而没有所有这些大量的内存预留.此外,如果我重新使用它们,命令行参数将无效(这是有道理的,因为它是由调用进程创建的管道).
我可以在事后将windbg附加到进程(这是我找到有问题的内存区域的方式),但我不确定在那时可以确定谁分配了什么.
大卫王回答了类似的问题:
[...] ASP.Net性能开发人员告诉我:
保留虚拟内存无需担心.您可以将其视为CLR的性能/缓存先决条件.重载测试表明无需担心.
System.Windows.Forms - 它没有被空的hello world ASPX页面拉入.您可以使用Microsoft调试工具和"sx e ld system.windows.forms"来确定在运行时实际提取它的内容.或者你可以ildasm找到依赖.
mscorlib - 确保它是正确的GAC和NGen.