Comprender los contadores de rendimiento de la memoria

[Actualización - 30 de septiembre de 2010]

Como estudié mucho sobre este y otros temas relacionados, escribiré los consejos que obtuve de mis experiencias y sugerencias proporcionadas en las respuestas aquí.

1) Use el generador de perfiles de memoria (pruebe CLR Profiler, para empezar) y encuentre las rutinas que consumen el máximo de memoria y ajústelas, como reutilizar grandes matrices, trate de mantener las referencias a los objetos al mínimo.

2) Si es posible, asigne objetos pequeños (menos de 85k para .NET 2.0) y use grupos de memoria si puede evitar el uso elevado de CPU por parte del recolector de basura.

3) Si aumenta las referencias a objetos, es responsable de desreferenciarlos la misma cantidad de veces. Tendrá tranquilidad y el código probablemente funcionará mejor.

4) Si nada funciona y aún no tiene idea, use el método de eliminación (comentario / código de omisión) para averiguar qué consume más memoria.

El uso de contadores de rendimiento de memoria dentro de su código también podría ayudarlo.

Espero que estos ayuden!

[Pregunta original]

¡Hola!

Estoy trabajando en C #, y mi problema es la excepción de memoria insuficiente.

Leí un excelente artículo sobre LOH aquí ->http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/

Impresionante lectura!

Y,http://dotnetdebug.net/2005/06/30/perfmon-your-debugging-buddy/

Mi problema:

Me estoy quedando sin problemas de memoria en una aplicación de escritorio de nivel empresarial. Traté de leer y comprender cosas sobre la creación de perfiles de memoria y el contador de rendimiento (¡también probé WinDBG!

Intenté CLR profiler para analizar el uso de memoria. Fue útil en:

Mostrándome quién asignó enormes fragmentos de memoria

Qué tipo de datos usó la memoria máxima

Pero, ambos, CLR Profiler y Performance Counters (ya que comparten los mismos datos), no pudieron explicar:

Los números que se recopilan después de cada ejecución de la aplicación: ¿cómo entender si hay alguna mejora?

¿Cómo comparo los datos de rendimiento después de cada ejecución? ¿Es bueno o malo un número menor / mayor de un contador en particular?

Lo que necesito:

Estoy buscando los consejos sobre:

Cómo liberar (sí, correcto)gestionado objetos de tipo de datos (como matrices, cadenas grandes), pero no haciendo GC. Recoja llamadas, si es posible. Tengo que manejar matrices de bytes de longitud como 500 KB (tamaño inevitable :-() de vez en cuando.

Si se produce fragmentación, cómo compactar la memoria, ya que parece que .NET GC realmente no está haciendo eso efectivamente y está causando OOM.

Además, ¿cuál es exactamente el límite de 85 KB para LOH? ¿Es este el tamaño del objeto del tamaño total de la matriz? Esto no está muy claro para mí.

¿Qué contadores de memoria pueden decir si los cambios en el código realmente reducen las posibilidades de OOM?

Consejos que ya conozco

Establezca los objetos administrados en nulos, márquelos como basura, para que el recolector de basura pueda recolectarlos. Esto es extraño: después de configurar uncuerda[] objetar a nulo, el# bytes en todos los montones ¡disparado!

Evite crear objetos / matrices> 85 KB; esto no está bajo mi control. Entonces, podría haber mucho LOH.

3)

Memory Leaks Indicators:

# bytes in all Heaps increasing
Gen 2 Heap Size increasing
# GC handles increasing
# of Pinned Objects increasing
# total committed Bytes increasing
# total reserved Bytes increasing
Large Object Heap increasing

Mi situación:

Tengo una máquina de 4 GB y 32 bits con el servidor Wink 2K3 SP2.Entiendo que una aplicación puede usar <= 2 GB de RAM físicaAumentar el tamaño de la memoria virtual (archivo de página) no tiene ningún efecto en este escenario.

Como su problema OOM, solo me estoy enfocando solo en contadores relacionados con la memoria.

¡Por favor aconséjame!¡Realmente necesito ayuda ya que estoy atascado por falta de buena documentación!

Respuestas a la pregunta(3)

Su respuesta a la pregunta