2012-02-08 15 views
9

Estoy viendo algunos patrones inusuales de recolección de basura en .NET 4.0 que no puedo explicar, cualquier consejo sería apreciado.Patrones inusuales de recolección de basura

En varias ocasiones en la ejecución de mi programa, el recuento de la colección G2 comienza a aumentar y el tiempo de GC% llega a casi el 100%. Esto continúa durante un tiempo antes de detenerse (consulte la captura de pantalla del monitor de rendimiento a continuación). Durante este tiempo, una traza PerfView de los eventos CLR GC ETW muestra que varias colecciones G2 de larga ejecución se activan una detrás de la otra con el motivo 'AllocSmall'.

¿Alguien puede arrojar algo de luz sobre: ​​

  1. Preciesly lo que provoca un 'AllocSmall' caso
  2. por qué estos están provocando directamente colección G2
  3. Por qué estas colecciones G2 se están produciendo espalda con espalda

LowMemory no parece ser el problema, ya que los eventos de inicio del GC no lo incluyen como su código de razón (http://msdn.microsoft.com/en-us/library/ff356162.aspx). También hemos visto situaciones similares en las que las colecciones G0 se producen consecutivamente.

Editar: Se ha sugerido que el desencadenador podría superar un umbral. Dado que todavía hay memoria disponible, esperaría que el G2 Heap se expandiera en este punto en lugar de que el GC thrash intente recopilar.

Editar: Las fotos publicadas a continuación son mucho mayor resolución que las pantallas StackOverflow - basta con abrir el enlace de imagen directamente en una pestaña del navegador.

Performance Monitor Trace PerfView Event Trace

Respuesta

3

Reasons Garbage Collect Occurs:

  1. el sistema tiene poca memoria física.

  2. La memoria que utilizan los objetos asignados en el almacenamiento dinámico administrado supera un umbral aceptable. Esto significa que se ha excedido un umbral de uso de memoria aceptable en el montón administrado. Este umbral se ajusta continuamente a medida que se ejecuta el proceso.

  3. Se llama al método GC.Collect. En casi todos los casos, no tiene que llamar a este método, porque el recolector de basura se ejecuta continuamente. Este método se usa principalmente para situaciones y pruebas únicas.

Parece # 2 es el caso, es decir que ha 'superado un umbral aceptable'. +1 por vaguedad de Microsoft.

+0

Gracias por la respuesta. En estas circunstancias, espero que el G2 Heap se expanda, ya que todavía hay memoria disponible. ¿Alguien puede comentar por qué esto no ha sucedido? –