/ / GC.Collect call and OutOfMemory - .net, recolección de basura, memoria insuficiente

GC.Collect call and OutOfMemory - .net, recolección de basura, memoria insuficiente

Cuando llamo a GC.Coleccionar todo funciona bien. Pero si comento esta llamada, recibo de OutOfMemory. Se ve muy extraño. ¿Cómo encontrar este error?

información adicional La aplicación de la aplicación tiene algunos proyectos que tienen referencias a diferentes marcos de trabajo de 2.0 a 4.0 Aplicación es una aplicación de formularios de Windows, se utiliza devexpress.

Respuestas

2 para la respuesta № 1

Las variantes más probables:

  1. Fragmentación de montón de objetos grandes. En la aplicación se utiliza una gran cantidad de colecciones de gran tamaño hasta un millón de elementos, como HashSet, Diccionario, etc. Todos ellos llaman Array.Resize de vez en cuando. Entonces, GC.Collect no resuelve el problema, solo ralentiza la fragmentación.
  2. código no administrado

Editado: 3. System.Drawing tiende a lanzar una excepción OOM en algunos casos


1 para la respuesta № 2

Probablemente te olvides de disponer un objeto. ¿Utiliza alguna base de datos u otros recursos externos?


1 para la respuesta № 3

Si tiene que llamar a GC.Collect, entonces algo está mal. Por lo general, no debería necesitar llamar al recolector de basura.

  1. Probar un generador de perfiles de memoria. Esto le mostrará cuántos objetos de qué tipo consumen su montón.
  2. Revise sus recursos no administrados. Cada recurso no administrado debe ser administrado por una clase que implementa IDispoable junto con un finalizador.

0 para la respuesta № 4

Un enfoque común para depurar las fugas de memoria en .net es usar el llamada de socorro-Extensión (encontrarás algunos tutoriales como esta Si hace alguna investigación) o para usar un generador de perfiles de memoria, como esta uno. Maby, ¿simplemente te olvidas de liberar (disponer) algunos recursos no administrados?


0 para la respuesta № 5

Intentaría depurar problemas de memoria administrada con el Perfilador CLR.

Además, ¿por qué te llamas GC.Collect ()? Esto suele ser un anti-patrón.