8

在我的机器(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 过滤器)启动的进程,如果我尝试自己启动它以调试它它只是在没有所有这些大量内存保留的情况下关闭。此外,如果我重用它们,命令行参数是无效的(这是有道理的,因为它是由调用进程创建的管道)。

我可以在事后将它附加到进程中(这就是我找到有问题的内存区域的方式),但我不确定当时是否有可能确定谁分配了什么。

4

3 回答 3

7

David Wang回答了一个类似的问题

[...] ASP.Net 性能开发人员告诉我:

  • 保留的虚拟内存无需担心。您可以将其视为 CLR 的性能/缓存先决条件。并且重载测试表明这没什么好担心的。
  • System.Windows.Forms - 它不是由空的 hello world ASPX 页面拉入的。您可以使用 Microsoft 调试工具和“sx e ld system.windows.forms”来确定在运行时实际将其拉入的内容。或者您可以通过 ildasm 找到依赖项。
  • mscorlib - 确保它是正确的 GAC'd 和 NGen'd。
于 2008-12-10T13:17:49.423 回答
3

虚拟内存只是分配给进程的地址空间。它与内存使用无关。

看:

  1. 虚拟内存
  2. 突破 Windows 的极限:虚拟内存
  3. http://support.microsoft.com/kb/555223
于 2008-12-10T12:59:23.127 回答
0

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

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

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

c:\windows\system32\inetsrv\w3wp.exe -a \.\pipe\iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap "DefaultAppPool"

我不确定那里的 UID 指定了什么,但看起来它可能是由 W3SVC 服务(这是启动 w3wp.exe 的内容)动态生成的,用于命名那里指定的管道。因此,在从 windbg 启动 w3wp 之前,您绝对应该查看您的命令行。

于 2008-12-10T13:18:34.443 回答