2012-02-01 13 views
8

Dentro de una aplicación compleja de subprocesos múltiples, estoy llegando a una excepción de memoria insuficiente, tal vez una vez a la semana. La aplicación está enviando/leyendo cantidades masivas de datos a través de varios sockets, donde los datos de lectura se almacenan en caché para evitar sobrepasos de búfer de la tarjeta de red.
¿Cuál es la mejor estrategia para analizar las excepciones de memoria? Durante el tiempo de ejecución normal, la aplicación se muestra con un tamaño de "Total de bytes en todos los montones" de hasta 1,5 Gigabytes en el Explorador de procesos.
Podría ser una estrategia para tener un hilo que es de sondeo ya seaC# Excepción de falta de memoria: estrategia de advertencia

GC.GetTotalMemory()

o

PrivateMemorySize64()

una vez segundo para saber cuándo comenzar a analizar cosas? Aún no he investigado los perfiles comerciales y estoy un poco preocupado por el impacto en el rendimiento de los mismos, lo que también podría dar resultados erróneos con respecto al análisis del problema real.

+1

¿Cómo funciona el almacenamiento en caché? Buscaría una estrategia de asignación diferente para su almacenamiento en caché. – CodesInChaos

+0

Para aclarar, ¿sabe qué causa la excepción de falta de memoria y solo está buscando una forma de configurar el almacenamiento en caché en su aplicación para que esto no suceda? ¿O es que no sabes exactamente qué lo causa y quieres depurar el problema? – svick

Respuesta

3

Su memoria probablemente está siendo fragmentada a partir de numerosas operaciones de cadena u otras operaciones que crean y liberan pequeños bloques de memoria, como el boxeo/unboxing.

Obtendrá esta excepción cuando el CLR no pueda asignar un bloque de memoria libre lo suficientemente grande.

Uso el "CLR Profiler" y verifico las asignaciones de memoria. Si ve numerosos puntos blancos (bloques libres) y no tiene bloques libres grandes, entonces debe comenzar a observar cómo está asignando los objetos.

Por ejemplo, antes de asignar una cadena a otra, verifique si las cadenas son diferentes primero. Usar StringBuilder es todos los casos, eliminar el boxeo y otras optimizaciones de memoria.

Utilizo esta técnica y eliminé completamente las excepciones, excepto por un problema conocido con la deserialización binaria.

Redescubrir el arte perdido de optimización de la memoria en el código administrado en http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

La investigación de la memoria Problemas en http://msdn.microsoft.com/en-us/magazine/cc163528.aspx

optimización del rendimiento en Visual Basic .NET en http://msdn.microsoft.com/en-us/library/aa289513 (v = vs.71) .aspx

+2

La mayoría de las cadenas deberían ser reubicables y, por lo tanto, no deberían provocar la fragmentación de la memoria. La fragmentación de LoH puede ser un problema, pero si está utilizando muchas cadenas lo suficientemente grandes como para terminar en el LoH, probablemente esté haciendo algo mal. – CodesInChaos

+0

¿Qué quiere decir con otras optimizaciones de memoria? En una parte estoy usando divisiones, expresiones regulares, pilas y listas. Necesita volver a verificar para el boxeo – weismat

+0

No puede reubicar la memoria si no hay un bloque lo suficientemente grande. Es por eso que se lanza la excepción de falta de memoria. Nunca he visto LOH causando excepciones de falta de memoria. Para eso sirve, un montón de grandes bloques de memoria que se pueden asignar sin la necesidad de encontrar un gran bloque continuo de memoria libre. – AMissico

0

¿Qué le parece usar referencias débiles para el almacenamiento en caché? clicky

+3

Solo para su información, esto proviene de las Weal References Guildlines: "Evite utilizar referencias débiles como una solución automática para problemas de administración de memoria. En su lugar, desarrolle una política de caché efectiva para manejar los objetos de su aplicación". –

+0

No hay tantos lugares en los que las referencias débiles podrían ayudar: creo que dividiría el proceso en dos para duplicar el espacio de datos disponible. Lo he evitado por razones administrativas hasta ahora. – weismat

1

Se podría considerar la instalación de las herramientas de depuración para Windows y usando adplus

ADPlus.vbs (ADPlus) es una herramienta de soporte técnico de Microsoft (PSS) que puede solucionar cualquier proceso o aplicación que se detiene responder (se bloquea) o falla (falla).

Básicamente, puede configurar que vea la aplicación, y cuando se bloquea, capturará un volcado, que luego puede analizar con WinDBG/SOS.

+0

Podría seguir este camino: supongo que lo agregaré a mi lista de tareas programadas, de modo que comience todos los días, ya que cada día requerirá un nuevo comienzo (ya que el .exe también se inicia a diario). – weismat

1

Se puede utilizar un MemoryFailPoint para tratar de darle algunas garantías en una operación dada

pero recomiendo aislar el proceso que su aplicación se está ejecutando en, moviéndose a 64 bits si eso es una opción y es posible que necesite busque reducir el rendimiento para darle garantías razonables de su uso de memoria.

Cuestiones relacionadas