在我的计算机(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”来识别运行时实际将其拉动的内容。或者,您可以努力士以找到依赖性。
  • mscorlib - 确保它正确地经过 GAC 和 NGen 处理。

其他提示

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

看:

  1. 虚拟内存
  2. 突破 Windows 的极限:虚拟内存
  3. http://support.microsoft.com/kb/555223

保留的存储器是从分配存储器很大的不同。预留的内存只是分配的地址空间。并不承担任何物理页。

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

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

  

C:\ Windows \ System32下\ INETSRV \ w3wp.exe的-a \ \管\ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap “默认应用”

我不知道是什么的UID在那里指定,但看起来它是由W3SVC服务飞(这是推出的w3wp.exe)来命名规定有管道可能产生。所以,你一定要看看你的命令行从WinDbg的启动W3WP之前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top