¿Los recolectores de basura generacionales son inherentemente amigables con el caché?

38

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?

Gilles 'SO- deja de ser malvado'
fuente
una meta discusión relacionada sobre las etiquetas apropiadas para la pregunta.
Kaveh

Respuestas:

19

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.

Matt Balkam
fuente
10

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.

vzn
fuente
Entonces, ¿ podría argumentar que los GC generacionales son compatibles con la memoria caché en comparación con los no generacionales (clásicos)?
Raphael
Yo diría que el GC debe diseñarse de manera integrada con cachés y memoria virtual como parte de su diseño, lo cual es complicado en las arquitecturas existentes. sin embargo, para ampliar la respuesta: sí, los recolectores generacionales agregan / consolidan / agrupan los objetos utilizados con frecuencia en la memoria contigua, que será inherentemente más compatible con la memoria caché que otros diseños en los que los objetos utilizados con frecuencia y con poca frecuencia están dispersos / entremezclados (aunque estos últimos todavía tendrá algún beneficio de caché).
vzn
1
Un aspecto algo complicado de combinar GC y arquitecturas de almacenamiento en caché / virtualización es que a estas arquitecturas generalmente no les importa el contenido de las páginas de memoria, pero en un sistema GC deben hacerlo. Los diferentes lenguajes a veces prometen diferentes funciones relacionadas con GC a los programadores, y descubrir qué características admitir a nivel de sistema operativo puede ser difícil. El mejor enfoque probablemente diría que cada objeto necesita contener un puntero a una estructura cuyos campos iniciales están definidos por el sistema operativo, pero que pueden ser seguidos por datos específicos del idioma que el sistema operativo no conocería o no le importaría.
supercat