Pregunta

En mi máquina (XP, 64) el proceso de trabajo ASP.net (w3wp.exe) siempre se pone en marcha con 5,5 GB de memoria virtual reservada. Esto ocurre independientemente de la aplicación web que hospeda (que puede ser cualquier cosa, incluso una página web vacía en aspx).

Esta gran parte antigua de la memoria virtual está reservado por el momento se inicia el proceso, por lo que esta no es una "fuga" gradual de la memoria de algún tipo.

Algunos husmear con windbg muestra que la memoria está pregunta es privado, reservado y RegionUsageIsVAD, lo que indica que podría ser obra de alguien llamando VirtualAlloc. También muestra que la memoria en cuestión está asignado / reservada en 4 grandes trozos de 1 GB cada uno y un varios más pequeños (1/4 GB cada uno).

Así que supongo que necesito averiguar quién está llamando VirtualAlloc y la reserva de toda esta memoria. ¿Cómo lo hago?

Colocación de un depurador al proceso previo a la asignación de memoria es complicado, porque w3wp.exe es un proceso iniciado por svchost.exe (es decir, IIS / filtro de ASP.Net) y si trato de poner en marcha yo mismo con el fin depurarlo simplemente cierra sin toda esta reserva de memoria profusa. Además, los parámetros de línea de comandos son válidos si los resuse (lo cual tiene sentido porque es un tubo creado por el proceso de llamada).

puedo enviar windbg al proceso después del hecho (que es lo que encontré las regiones de memoria en cuestión), pero no estoy seguro de que es posible en ese momento para determinar quién lo asignado.

¿Fue útil?

Solución

David Wang respuestas a esta una pregunta similar :

  

[...] el desarrollador rendimiento ASP.Net me dice que:

     
      
  • La memoria virtual Reservados hay nada de qué preocuparse. Puede ver   como el rendimiento / requisito de almacenamiento en caché   del CLR. Y de carga pesada   muestra que es nada de qué preocuparse   acerca de.
  •   
  • System.Windows.Forms - No es empujados por vacío hola mundo ASPX   página. Puede utilizar Microsoft Depuración   Herramientas y "E ld sx   System.Windows.Forms" para identificar qué   en realidad está tirando de él en el momento de la ejecución.   O puede ILDASM para encontrar el   dependencia.
  •   
  • mscorlib - asegurarse de que es GAC'd y NGen'd correctamente
  • .   

Otros consejos

La memoria virtual es sólo el espacio de direcciones asignado al proceso. No tiene nada que ver con el uso de memoria.

Ver:

  1. memoria virtual
  2. Superación de los límites de las ventanas: la memoria virtual
  3. http://support.microsoft.com/kb/555223

reservados de memoria es muy diferente de asignado memoria. La reserva de memoria justo asigna espacio de direcciones. No compromete a ninguna de las páginas físicas.

Este espacio de direcciones es probable asignado por IIS por su montón. Sólo se comprometerá páginas cuando sea necesario.

Si realmente quiere poner en marcha a partir de w3wp.exe windbg, es probable que necesite para poner en marcha con argumentos de línea de comandos válidos. Puede usar Process Explorer para determinar cuál es la línea de comandos para el actual proceso w3wp.exe es. Por ejemplo, en mi servidor, la mía era:

  

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

No estoy seguro de lo que el UID de allí se especifica, pero parece que probablemente ha generado sobre la marcha por el servicio W3SVC (que es lo que puso en marcha w3wp.exe) a nombre de la tubería especificada allí. Por lo que debería mirar a su línea de comandos antes de lanzar w3wp de windbg.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top