Tengo una situación extraña que estoy tratando de resolver.¿Qué desencadena una recolección de basura gen2?
El Génesis:
estoy corriendo mi programa en una máquina física con núcleos y 128 GB de RAM. Estoy tratando de determinar por qué no está utilizando todos los núcleos disponibles, por lo general utiliza un 20-25% de CPU en promedio (por lo que 4-5 núcleos de los 16). Cuando miro los contadores de rendimiento, se muestran en el orden de 60-70% de tiempo en la recolección de basura.
Como referencia, estoy usando .NET Framework 4 y el TPL (Parallel.ForEach) para enhebrar la parte de mi programa que requiere mucho rendimiento. Estoy limitando la cantidad de hilos a la cantidad de núcleos.
El problema:
estaba creando un gran número de objetos, demasiados para el recolector de basura para manejar de manera eficiente y por lo tanto, pasé una gran cantidad de tiempo en el recolector de basura.
La solución más sencilla hasta la fecha:
estoy presentando la agrupación de objetos para reducir la presión en el colector de basura. Continuaré agrupando objetos para mejorar el rendimiento, ya que la agrupación de algunos objetos redujo la recolección de basura del 60-70% del tiempo al 45% del tiempo y mi programa se ejecutó un 40% más rápido.
La Persistente pregunta (la que espero que responder por mí):
Mi programa cuando se ejecuta usos como máximo 14 GB de la memoria RAM disponible, en comparación con 128 GB de RAM esto es bastante pequeña. Nada más se está ejecutando en esta máquina (es simplemente un banco de pruebas para mí) y hay mucha RAM disponible.
- Si hay suficiente RAM disponible, ¿por qué se producen colecciones gen2 (o completas)? Se está produciendo una cantidad bastante grande de estas colecciones gen2 (en miles). es decir, cómo determina el umbral para iniciar una colección gen2?
- ¿Por qué el recolector de basura simplemente no demora ninguna colección completa hasta que la presión en la RAM física alcanza un umbral más alto?
- ¿Hay alguna manera en que pueda configurar el recolector de elementos no utilizados para esperar un umbral más alto? (Es decir, no se molestan en absoluto si la recogida no es necesario)
EDIT:
ya estoy usando la opción de utilizar el recolector de basura servidor ... lo que necesito saber es lo que está provocando una gen2 collection, no es que el recolector de basura del servidor sea mejor (ya lo sé).
Ya estoy usando el recolector de basura del servidor (es más eficiente con muchos núcleos debido a la regla de un montón por núcleo). Aunque aprecio su sugerencia útil, eso realmente no respondió mi pregunta :( –
@Jeffrey: Vea mi edición sobre el Montículo de Objetos Grandes. –
Ese es un buen punto.Aunque no creo que esté haciendo eso, mi montón de LOH normalmente tiene solo una matriz pero voy a profundizar un poco más en eso. –