2008-12-10 70 views
7

在我的机器(XP,64)上,ASP.net工作进程(w3wp.exe)始终启动,保留5.5GB的虚拟内存。无论其托管的Web应用程序如何(它可以是任何东西,甚至是aspx中的空白网页)。确定在w3wp.exe中保留了谁/保留了5.5 GB的虚拟内存

这个虚拟内存的大块在进程启动时被保留下来,所以这不是某种缓存“泄漏”。

有些使用windbg进行窥探表明内存问题是Private,Reserved和RegionUsageIsVAD,这表明它可能是某人调用VirtualAlloc的工作。它还表明,所讨论的内存分配/保留在每个1GB的4个大块和几个较小的块(每个1/4GB)中。

所以我想我需要找出谁在调用VirtualAlloc并保留所有这些内存。我怎么做?

因为w3wp.exe是由svchost.exe启动的进程(即IIS/ASP.Net过滤器),并且如果我尝试自行启动它,因此在内存分配之前将调试程序附加到进程上是非常棘手的为了调试它,它只是关闭而没有所有这些大量的内存预留。另外,如果我重新使用命令行参数(这很有意义,因为它是由调用进程创建的管道),所以命令行参数无效。

我可以在事实之后(这是我如何找到有问题的内存区域)将windbg附加到进程中,但我不确定在那一点可能确定谁分配了哪些内容。

+1

我只想说“哦,我的上帝”! – StingyJack 2008-12-10 13:09:38

+0

这是我见过的新标记的第一个相关用法(当然,除了NBC.com上的英雄页面之外)! – 2008-12-10 13:21:34

+0

我在服务器2008,IIS7 – 2009-12-21 19:35:31

回答

7

王大卫answers this to a similar question

[...]在ASP.Net性能开发板的每个告诉我:

  • 保留虚拟内存是没有什么可担心的。您可以查看 它作为CLR的性能/缓存先决条件 。而重负荷测试 显示它没什么好担心 一下。
  • System.Windows.Forms - 它不是由空的你好世界ASPX 页拉。您可以使用Microsoft Debugging 工具和“sx e ld system.windows.forms”来确定 实际上在运行时将其拉入。 或者您可以通过ildasm查找 依赖项。
  • mscorlib - 确保它是GAC'd和NGen'd正确。
0

保留内存为分配内存很大的不同。保留内存只是分配地址空间。它不提交任何物理页面。

此地址空间很可能由IIS分配给它的堆。它只会在需要时提交页面。

如果你真的想从windbg启动w3wp.exe,你可能需要用有效的命令行参数启动它。您可以使用Process Explorer来确定当前w3wp.exe进程的命令行是什么。例如,我的服务器上,我的是:

C:\ WINDOWS \ SYSTEM32 \ INETSRV \ w3wp.exe的-a \ \管\ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap“ DefaultAppPool“

我不确定那里的UID指定了什么,但它看起来可能是由W3SVC服务(这是启动w3wp.exe)命名的管道命名的。所以你应该在从windbg启动w3wp之前看看你的命令行。