Ya se han sugerido muchas soluciones útiles y el artículo de MSDN es muy minucioso. Junto con las sugerencias anteriores, también haría lo siguiente;
Correlacione el tiempo de la excepción con su archivo de registro para ver qué estaba pasando en el momento de la excepción OOM. Si tiene poco registro en el nivel de información o depuración, le sugiero que agregue algunos registros para que tenga una idea del contexto en torno a este error.
¿El uso de memoria aumenta gradualmente durante un largo período de tiempo antes de que la excepción (por ejemplo, un proceso de servidor que se ejecuta indefinidamente) o un salto en grandes aumentos bastante rápidamente hasta la excepción?¿Hay muchos hilos en ejecución o solo uno?
Si la primera es verdadera y la excepción no ocurre durante mucho tiempo, implicaría que los recursos tienen fugas tienen fugas como se indicó anteriormente. Si lo posterior es cierto, varias cosas podrían contribuir a la causa, p. un bucle que asigna mucha memoria por iteración, recibe un gran conjunto de resultados de un servicio, etc.
De cualquier forma, el archivo de registro debe proporcionarle suficiente información sobre dónde empezar. Desde allí, me aseguraría de poder recrear el error ya sea emitiendo un cierto conjunto de comandos en la interfaz o usando un conjunto consistente de entradas. Después de eso, dependiendo del estado del código, trataría (con el uso de la información del archivo de registro) de crear algunas pruebas de integración que apuntaran a la fuente supuesta del problema. Esto debería permitirle recrear la condición de error mucho más rápido y hacer que sea mucho más fácil de encontrar ya que el código en el que se está concentrando será mucho más pequeño.
Otras cosas que suelo hacer es rodear el código sensible a la memoria con una pequeña clase de creación de perfiles. Esto puede registrar el uso de la memoria en el archivo de registro y darle visibilidad inmediata de los problemas en el registro. La clase se puede optimizar para que no se compile en compilaciones de lanzamiento o tenga una pequeña sobrecarga de rendimiento (si necesita más información contácteme). Este tipo de enfoque no funciona bien cuando se asignan muchos hilos
Mencionó recursos no administrados ¿Supongo que se administra todo el código que usted/su equipo ha escrito? De lo contrario, y si fuera posible, rodearía los límites no gestionados con una clase de creación de perfiles similar a la mencionada anteriormente para descartar fugas del código no administrado o la interoperabilidad. Fijar muchos punteros no administrados también puede causar la fragmentación del montón, pero si no tiene un código no administrado, se pueden ignorar ambos puntos.
No se recomienda invocar explícitamente al recolector de elementos no utilizados en un comentario anterior. Aunque rara vez deberías hacer esto, hay momentos en los que es válido (busca el blog de Rico Mariani para ver ejemplos). Un ejemplo (cubierto en el blog mencionado) en el que he llamado explícitamente recopilar es cuando se han devuelto grandes cantidades de cadena de un servicio, se han puesto en un conjunto de datos y luego se han unido a una grilla. Incluso después de que se cerró la pantalla, esta memoria no se recopiló durante un tiempo. En general, no se debe invocar explícitamente ya que el recolector de elementos no utilizados mantiene las métricas sobre las que basa (entre otras cosas) las colecciones. Llamar por cobrar invalida explícitamente estas métricas.
Por último, generalmente es bueno tener una idea de los requisitos de memoria de su aplicación. Puede obtener esto registrando más información, ocasionalmente ejecutando el generador de perfiles, pruebas de estrés/unidad/integración. Obtenga una idea de qué impacto tiene una determinada operación en un nivel alto, p. basado en un conjunto de entradas aproximadamente x serán asignadas. Obtengo una comprensión de esto al cerrar la sesión de información detallada en puntos estratégicos en el archivo de registro. Un archivo de registro inflado puede ser difícil de entender o interpretar.
en mi humilde opinión, en este caso la captura de la excepción con el depurador será inútil, el daño (fuga de memoria muy probablemente) ya se ha hecho en otro lugar. – Naveen
Solo tirando un par de opciones. No puede doler mirar. – tsilb
tslib tiene un punto, a veces puede reducir cuando se está quedando sin memoria. – Gregory