2008-10-21 11 views
17

Incluso una aplicación simple Notepad en C# consume megabytes de RAM como se ve en el administrador de tareas. Al minimizar la aplicación, el tamaño de la memoria en el administrador de tareas disminuye considerablemente y se realiza una copia de seguridad cuando la aplicación se maximiza..NET Huella de memoria EXE

Leí en alguna parte que el proceso .NET reserva una gran cantidad de memoria para la asignación del tiempo de ejecución por adelantado. Es por eso que las aplicaciones .NET tienen una huella de memoria más grande para empezar. Pero esta memoria puede ser liberada usando llamadas API de Win32. Una desventaja es que la asignación del tiempo de ejecución se vuelve lenta, ¿es cierto?

Respuesta

22

TaskManager no se debe utilizar para medir la huella de memoria de una aplicación .NET.

Cuando se inicia una aplicación .NET, le pide al sistema operativo un pedazo de memoria que luego segmenta para convertirse en el montón de almacenamiento, pila y montón de objetos administrados. Es este trozo total de memoria que TaskManager está informando, que puede o no ser completamente utilizado por .NET. Una vez que una aplicación .NET recibe una porción de memoria, no la liberará hasta que el sistema operativo la solicite, lo que solo ocurrirá cuando el sistema operativo determine que se necesitan más recursos de memoria.

Si desea medir las asignaciones de memoria, debe consultar los diversos monitores del monitor de rendimiento (PerfMon).

Puede usar el código de interoperabilidad para llamar a las API de Win32 para recortar su tamaño de conjunto de trabajo, pero la próxima vez que su aplicación solicite memoria del sistema operativo, el conjunto de trabajo volverá a funcionar y habrá un rendimiento mientras el SO asigna y entrega la memoria adicional y el tiempo de ejecución de .NET la "configura".

30

El motivo de la gran huella de memoria es que el compilador JIT y el motor Windows Forms se están cargando con su proceso. Para reducir esto, puede hacer lo siguiente:

[DllImport("psapi.dll")] 
static extern int EmptyWorkingSet(IntPtr hwProc); 

static void MinimizeFootprint() 
{ 
    EmptyWorkingSet(Process.GetCurrentProcess().Handle); 
} 

Esto debería eliminar tanto como sea posible de la huella de su memoria. También puede haber una forma de reducir la cantidad de memoria reservada para la asignación de memoria de tiempo de ejecución.

+2

¿Hay algún intercambio en vaciar el conjunto de trabajo. – dotnetcoder

+2

Me gustaría agregar una nota de agradecimiento sobre esto ... Sé que el conjunto de trabajo no es una representación válida, pero ese número tiende a asustar a los administradores. Este consejo acaba de tomar una de mis aplicaciones en desarrollo de un promedio de 80 a 120 megas de trabajo establecido en 20 - 40. +1 –

+1

dotnetcoder - la desventaja es que incurrirá en un golpe de rendimiento si su aplicación necesita cualquiera de los recursos liberados, lo cual es relativamente probable. –

3

El administrador de tareas no muestra el uso real de la memoria para una aplicación .NET. Para ver que casi tiene que poner un contador de rendimiento en la aplicación o utilizar un generador de perfiles.

Lo que ves en el Administrador de tareas es la memoria de trabajo de una aplicación que incluye un montón de sobrecarga para el marco mismo que también se debe cargar cuando se carga tu aplicación.

Cuestiones relacionadas