Un recolector de basura generacional típico mantiene los datos asignados recientemente en una región de memoria separada. En los programas típicos, una gran cantidad de datos es de corta duración, por lo que recolectar basura joven (un ciclo menor de GC) con frecuencia y recolectar basura vieja con poca frecuencia es un buen compromiso entre la sobrecarga de memoria y el tiempo dedicado a hacer GC.
Intuitivamente, el beneficio de un recolector de basura generacional en comparación con un recolector de una sola región debería aumentar a medida que aumenta la relación de latencia de la memoria principal en relación con la memoria caché, porque los datos en la región joven se acceden con frecuencia y se mantienen en un solo lugar. ¿Los resultados experimentales corroboran esta intuición?
fuente
Respuestas:
Aquí hay algunos documentos que hablan sobre las implicaciones de caché de los recolectores de basura generacionales:
Por lo que puedo deducir, el problema principal es que los sistemas de recolección de basura intercambian espacio en la memoria para evitar la recolección inicial. Lo mismo se aplica a la memoria caché. Como sugirió, lo más probable es que las cosas de la primera generación estén en caché, por lo que su asignación y recopilación será mucho más rápida que algo en la memoria principal o paginada en el disco. El problema principal es el tamaño de la primera generación con respecto al tamaño de su caché. Si su caché se llena antes de que lo haga la primera generación, entonces comienza a perder esos beneficios a medida que las fallas comienzan a acumularse.
fuente
Hay un aspecto muy complicado de todos los recolectores de basura que puede pasar desapercibido en algunas descripciones, y es el "análisis completo" o "recopilación completa". Periódicamente, al azar, de forma intermitente deben escanear todos los objetos. los recolectores generacionales son mejores para posponer el escaneo completo y minimizar su duración, pero aún es necesario.
El coleccionista generacional se centrará en lo que a veces se llama el espacio de "vivero", pero eventualmente / inevitablemente tendrá que reunirse en el espacio de generación "más antiguo", causando un escaneo completo de la memoria.
Este escaneo completo es incompatible con casi todos los esquemas de almacenamiento en caché de memoria y (¡especialmente!) En el sentido de que casi todos los esquemas de almacenamiento en caché / virtualización de memoria fallarán en cualquier mejora de rendimiento en este caso.
Entonces, la respuesta clave a esta pregunta es con qué frecuencia se activa la exploración completa y qué tan "malo" es su efecto cuando ocurre, y si se puede tolerar. esto se reduce a una propiedad / pregunta más dependiente de la aplicación.
En otras palabras, para "la mayoría" de la operación del recolector, un caché probablemente lo ayudará (¡el caché y el espacio de guardería "joven" generalmente se superpondrán!), Pero hay un periódico, intermitente, eventual, inevitable, pesado, tal vez incluso un aumento "masivo" [degradante] en el rendimiento cuando el espacio de la "generación anterior" está completamente reunido y la "tasa de aciertos" de la memoria caché se degradará a muy mala, ya que muchos objetos fuera de él se recuperan en un bucle cerrado por completo ciclo de escaneo / recolección. En otras palabras, una discontinuidad periódica ineludible (donde las estimaciones estadísticas / promedios / tendencias de rendimiento, etc. son engañosas e inaplicables).
Lo que está surgiendo ahora son algunos nuevos sistemas de recopilación diseñados para combinar con los sistemas de administración de memoria subyacentes (almacenamiento en caché / virtualización). parece que los enfoques históricos que desacoplan por completo los sistemas separados de recolección de memoria, almacenamiento en caché y virtualización no funcionarán tan bien como los enfoques que combinan / integran / abordan los tres aspectos juntos.
Ver, por ejemplo, recolección de basura con reconocimiento de caché por Zhou y Demsky.
fuente