memory-management - collection - que es garbage collector en programacion
¿Cuál es la diferencia entre la recolección de basura incremental y generacional? (3)
Un GC generacional es siempre incremental, ya que no recoge todos los objetos inalcanzables durante un ciclo. Por el contrario, un GC incremental no necesariamente utiliza un esquema de generación para decidir qué objetos inalcanzables recolectar o no.
Un GC generacional divide los objetos inalcanzables en diferentes conjuntos, aproximadamente según su último uso: su edad, por así decirlo. La teoría básica es que los objetos que se crearon más recientemente se volverían inalcanzables rápidamente. Entonces el conjunto con objetos ''jóvenes'' se recoge en una etapa temprana.
Se puede implementar un GC incremental con el esquema generacional anterior, pero se pueden emplear diferentes métodos para decidir qué grupo de objetos se debe barrer.
Uno puede mirar esta página de wikipedia y más hacia abajo, para obtener más información sobre ambos métodos de GC.
Según el sitio web de Boehm, su GC es gradual y generacional:
El recopilador usa un algoritmo de barrido de marca. Proporciona recolección incremental y generacional bajo sistemas operativos que proporcionan el tipo correcto de soporte de memoria virtual.
En lo que se refiere a un entorno de tiempo real, hay varios trabajos de investigación académica que describen nuevas e ingeniosas formas de hacer la recolección de basura:
- Colección de basura en tiempo real sin bloqueo
- La recolección de basura en tiempo real de IBM tiene una buena explicación sobre las diferencias.
Creo que ambos (generacionales e incrementales) son enfoques diferentes para hacer que las pausas de recolección de basura sean más rápidas. Pero, ¿cuáles son las diferencias entre generacional e incremental? ¿Cómo trabajan? ¿Y cuál es mejor para el software en tiempo real / produce pausas menos largas?
Además, el Boehm GC es alguno de esos?
Un recolector de basura incremental es cualquier recolector de basura que puede ejecutarse de forma incremental (lo que significa que puede hacer un poco de trabajo, luego un poco más de trabajo, luego un poco más de trabajo), en lugar de tener que ejecutar toda la colección sin interrupción. Esto contrasta con los antiguos recolectores de basura del mundo que hicieron, por ejemplo, una marca y un barrido sin ningún otro código capaz de trabajar en los objetos. Pero para ser claros: Si un recolector de basura incremental realmente se ejecuta en paralelo a otro código que se ejecuta en los mismos objetos no es importante mientras sea interrumpible (para lo cual debe, por ejemplo, distinguir entre objetos sucios y limpios).
Un recolector de basura generacional diferencia entre objetos viejos, medianos y nuevos. Luego puede copiar GC en los objetos nuevos (palabra clave "Eden"), marcar y barrer para los objetos antiguos y diferentes posibilidades (dependiendo de la implementación) en los objetos medianos. Dependiendo de la implementación, la forma en que se distinguen las generaciones de objetos es por región ocupada en la memoria o por banderas. El desafío del GC generacional es mantener listas de objetos que se refieren de una generación a la otra.
Boem es un GC generacional incremental como se cita aquí: http://en.wikipedia.org/wiki/Boehm_garbage_collector
http://www.memorymanagement.org/glossary/i.html#incremental.garbage.collection
Algunos algoritmos de recopilación de recolección de basura pueden detenerse en el medio de un ciclo de recolección mientras el mutador continúa, sin terminar con datos inconsistentes. Dichos colectores pueden operar de forma incremental y son adecuados para su uso en un sistema interactivo.
Los recolectores de basura primitivos (1), una vez que comienzan un ciclo de recolección, deben finalizar la tarea o abandonar todo su trabajo hasta el momento. A menudo esta es una restricción apropiada, pero es inaceptable cuando el sistema debe garantizar tiempos de respuesta; por ejemplo, en sistemas con una interfaz de usuario y en sistemas de control de hardware en tiempo real. Dichos sistemas pueden usar una recolección de basura incremental para que el procesamiento crítico en el tiempo y la recolección de basura puedan avanzar de manera efectiva en paralelo, sin esfuerzos desperdiciados.
http://www.memorymanagement.org/glossary/g.html#generational.garbage.collection
La recolección de basura generacional está rastreando la recolección de basura que hace uso de la hipótesis generacional. Los objetos se juntan en generaciones. Los objetos nuevos se asignan en la generación más joven o de guardería, y se promueven a las generaciones mayores si sobreviven. Los objetos en las generaciones anteriores se condenan con menos frecuencia, ahorrando tiempo de CPU.
Por lo general, es raro que un objeto se refiera a un objeto más joven. Por lo tanto, los objetos en una generación suelen tener pocas referencias a los objetos en las generaciones más jóvenes. Esto significa que el escaneo de las generaciones anteriores en el curso de la recolección de las generaciones más jóvenes se puede hacer de manera más eficiente mediante juegos recordados.
En algunos lenguajes puramente funcionales (es decir, sin actualización), todas las referencias están hacia atrás en el tiempo, en cuyo caso los conjuntos recordados son innecesarios.
El Boehm-Demers-Weiser tiene un modo incremental que puede habilitar llamando a GC_enable_incremental
. Ver http://www.hpl.hp.com/personal/Hans_Boehm/gc/gcinterface.html