Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 确定w3wp.exe中谁/谁保留了5.5 GB的虚拟内存_Asp.net_Iis_Memory_Virtual Memory - Fatal编程技术网

Asp.net 确定w3wp.exe中谁/谁保留了5.5 GB的虚拟内存

Asp.net 确定w3wp.exe中谁/谁保留了5.5 GB的虚拟内存,asp.net,iis,memory,virtual-memory,Asp.net,Iis,Memory,Virtual Memory,在我的机器(XP,64)上,ASP.net工作进程(w3wp.exe)总是在保留5.5GB虚拟内存的情况下启动。无论托管的web应用程序是什么,都会发生这种情况(它可以是任何内容,甚至是aspx中的空网页) 这一大块旧的虚拟内存是在进程启动时保留的,因此这不是某种形式的渐进内存“泄漏” 一些使用windbg的窥探显示内存是私有的、保留的和RegionSageIsVad,这表明这可能是调用VirtualAlloc的人的工作。它还显示了所讨论的内存被分配/保留在4个大的块中,每个块为1GB,还有几个

在我的机器(XP,64)上,ASP.net工作进程(w3wp.exe)总是在保留5.5GB虚拟内存的情况下启动。无论托管的web应用程序是什么,都会发生这种情况(它可以是任何内容,甚至是aspx中的空网页)

这一大块旧的虚拟内存是在进程启动时保留的,因此这不是某种形式的渐进内存“泄漏”

一些使用windbg的窥探显示内存是私有的、保留的和RegionSageIsVad,这表明这可能是调用VirtualAlloc的人的工作。它还显示了所讨论的内存被分配/保留在4个大的块中,每个块为1GB,还有几个较小的块(每个块为1/4GB)

所以我想我需要找出是谁给VirtualAlloc打电话并保留所有的记忆。我该怎么做

在内存分配之前将调试器附加到进程是很棘手的,因为w3wp.exe是由svchost.exe(即IIS/ASP.Net筛选器)启动的进程,如果我尝试自己启动它以进行调试,它将关闭,而不会保留这么多内存。此外,如果我继续使用命令行参数,则这些参数无效(这是有意义的,因为它是由调用进程创建的管道)


我可以在事后将windbg-it附加到进程(这就是我如何找到有问题的内存区域的原因),但我不确定在那一点上是否可以确定谁分配了什么。

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

见:

  • 王大卫:

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

    • 保留的虚拟内存无需担心。您可以查看 它是性能/缓存的先决条件 CLR的成员。和重载测试 这表明没什么好担心的 大约
    • System.Windows.Forms-它不是由空的hello world ASPX拉入的 页您可以使用Microsoft调试 工具和“sx e ld” system.windows.forms”来确定 实际上是在运行时将其拉入。 或者你可以通过ildasm找到 依赖性
    • mscorlib-确保它是GAC'd和NGen'd正确的
    保留内存与分配内存非常不同。保留内存只是分配地址空间。它不提交任何物理页面

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

    如果确实要从windbg启动w3wp.exe,可能需要使用有效的命令行参数启动它。您可以使用来确定当前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之前,您应该先查看命令行。

    保留的虚拟内存量会影响进程的“虚拟大小”,这使得asp.net中基于虚拟内存限制的进程循环变得毫无用处。这意味着什么?由于寻址需求的增加,VM可能会增加。我不确定这是否会变得太大。我不能真正测试,这里只有32位Vista。你将得到最大3GB的虚拟机AFAIK,但每个进程只有大约2GB的实际内存最大值。我只想说“哦,我的上帝”!这是我第一次看到新标签的相关用法(当然是在NBC.com的英雄页面之外)!我在Server2008上看到了相同的行为,IIS7这些命令行参数是一次性的,不能重用,我尝试过。