garbage-collection - servicio - recoleccion de basura en san antonio tx
¿Diferencia entre el fondo y la recolección de basura concurrente? (3)
Aquí está la explicación del mundo real sin el insulto y el sentimiento inflado de auto-importancia:
En el GC concurrente se le permitió asignar mientras estaba en un GC, pero no se le permite iniciar otro GC mientras está en un GC. Esto, a su vez, significa que el máximo que puede asignar mientras está en un GC es el espacio que haya dejado en un segmento (actualmente 16 MB en modo de estación de trabajo) menos todo lo que ya está asignado allí).
La diferencia en el modo de fondo es que se le permite iniciar un nuevo GC (gen 0 + 1) mientras se encuentra en un GC de fondo completo, y esto le permite incluso crear un nuevo segmento para asignar si es necesario. En resumen, el bloqueo que podría ocurrir antes cuando asignó todo lo que podría en un segmento ya no ocurrirá.
De Tess da Man! http://blogs.msdn.com/b/tess/archive/2009/05/29/background-garbage-collection-in-clr-4-0.aspx
Leí que con .NET Framework 4 se reemplaza la implementación actual de recolección de basura:
.NET Framework 4 proporciona una recolección de basura de fondo. Esta función reemplaza la recolección de basura simultánea en versiones anteriores y proporciona un mejor rendimiento.
En esta página hay una explicación de cómo funciona, pero no estoy seguro de haberlo entendido.
En la aplicación práctica mundial, ¿cuál es el beneficio de esta nueva implementación de GC? ¿Es una característica que podría usarse para impulsar una transición de 3.5 o anterior a 4.0?
Aquí, Microsoft usa los nombres "concurrente" y "fondo" para describir dos versiones del GC que usa en .NET. En el mundo .NET, el "recopilador de fondo" es una mejora sobre el "recopilador concurrente" en el sentido de que tiene menos restricciones sobre lo que pueden hacer los subprocesos de la aplicación mientras se está ejecutando el recopilador.
Un GC básico usa una estrategia de "detener el mundo": los hilos aplicativos asignan bloques de memoria de un montón común. Cuando el GC debe ejecutarse (por ejemplo, se han asignado demasiados bloques, se necesita algo de limpieza), todos los subprocesos aplicativos (administrados) se detienen. El último hilo de detención ejecuta el GC y desbloquea todos los demás hilos cuando ha terminado. Un GC de parada en el mundo es fácil de implementar, pero provoca pausas que pueden ser perceptibles a nivel de usuario.
El "GC concurrente" de Microsoft es generacional: usa la estrategia de detener el mundo solo para una parte limitada del montón (lo que ellos llaman "generaciones 0 y 1"). Dado que esa parte sigue siendo pequeña, las pausas permanecen cortas (por ejemplo, por debajo de 50 ms), por lo que el usuario no las notará. El resto del montón se recopila con un subproceso GC dedicado, que puede ejecutarse simultáneamente con los subprocesos aplicativos (de ahí el nombre).
El GC concurrente tiene algunas limitaciones. Es decir, hay momentos en que el subproceso del GC debe asumir un control algo exclusivo del montón. Durante esos momentos, los subprocesos aplicativos pueden asignar bloques solo de áreas específicas de subprocesos pequeños. Los hilos que tienen mayores necesidades pronto se encontrarán con el montón principal, que, en ese momento, está bloqueado por el hilo GC. El subproceso de asignación debe bloquearse hasta que el subproceso del GC haya finalizado su fase de bloqueo del almacenamiento dinámico. Esto nuevamente induce pausas. Menos pausas que con un GC de parada en el mundo, y estas pausas no afectan a todos los subprocesos. Sin embargo, sin embargo, se detiene.
El "GC de fondo" es un GC mejorado en el que el hilo del GC no necesita bloquear el montón. Esto elimina las pausas adicionales descritas en el párrafo anterior; solo quedan las pausas limitadas cuando se recopilan las generaciones jóvenes (lo que Microsoft llama "una colección de primer plano").
Nota: existen "costos ocultos" con el GC concurrente y el GC de fondo. Para que estos GC funcionen correctamente, los accesos a la memoria desde los subprocesos aplicativos deben realizarse de una manera muy específica, lo que tiene un ligero impacto en el rendimiento. Además, el subproceso GC puede tener un efecto adverso en la memoria caché, lo que degrada indirectamente el rendimiento. Para una tarea puramente computacional sin necesidad de interacción por parte del usuario, un colector de Stop-the-world puede, en promedio , producir un rendimiento algo mejor (por ejemplo, un cálculo de veinte horas de duración se completará en diecinueve horas). Pero este es un caso de ventaja, y en la mayoría de las situaciones, el GC concurrente y el de fondo son mejores.
El beneficio principal será un menor número de bloqueos de aplicaciones debido a la recolección de basura, que en sí misma podría considerarse una mejora significativa. Para la mayoría de las aplicaciones, esta diferencia no se notará a menos que tenga un número ENORME de objetos de larga duración en la memoria.
Este cambio también hace que .NET sea un poco más viable para crear aplicaciones sensibles al tiempo (donde los tiempos de respuesta son importantes). El ejemplo extremo son las bolsas de aire para automóviles: no desea que su software esté ocupado en la recolección de basura cuando es necesario inflarlas. Los cambios en 4.0 reducen el número y la duración de las congelaciones debidas a la GCing, pero no las eliminan por completo.