haskell - recogen - recolectores de basura particulares
¿El recolector de basura de GHC tiene optimizaciones especiales para objetos grandes? (1)
Sí. El montón de GHC no se guarda en un tramo contiguo de memoria; más bien, se organiza en bloques .
Cuando el tamaño de un objeto asignado está por encima de un umbral específico (block_size * 8/10, donde block_size es 4k, aproximadamente 3.2k), el bloque que contiene el objeto se marca como grande (BF_LARGE). Ahora, cuando se produce la recolección de basura, en lugar de copiar objetos grandes de este bloque a uno nuevo, el bloque en sí se agrega al conjunto de bloques de la nueva generación; esto implica jugar con una lista enlazada (una lista de objetos grandes, para ser precisos).
Como esto significa que nos puede llevar un tiempo recuperar un espacio muerto dentro de un bloque grande, significa que los objetos grandes pueden sufrir fragmentación, como se ve en el error 7831 . Sin embargo, esto no suele ocurrir hasta que las asignaciones individuales alcanzan la mitad del tamaño del megabloque, 1M.
¿El recolector de basura GHC maneja objetos "grandes" especialmente? ¿O los trata exactamente igual que cualquier otro objeto?
Algunos motores de GC colocan objetos grandes en un área separada, que se escanea con menos frecuencia y posiblemente tiene un algoritmo de recopilación diferente (por ejemplo, compactación en lugar de copiar, o tal vez incluso usando listas de distribución en lugar de intentar desfragmentar) ¿GHC hace algo como esto?