Middle
Háblame de los métodos de recolección de basura (Garbage Collector).
sobes.tech AI
Respuesta de la IA
Métodos de recolección de basura:
- Contador de referencias (Reference Counting): Cada objeto mantiene un contador de referencias a sí mismo. Cuando el contador llega a cero, el objeto se considera basura y se elimina.
- Ventajas: Simple, no bloquea la ejecución principal por mucho tiempo.
- Desventajas: No maneja referencias cíclicas; requiere espacio adicional para el contador en cada objeto.
- Recolectores de basura de rastreo (Tracing Garbage Collectors): Comienzan con un conjunto de objetos "raíz" (por ejemplo, variables activas, pila de llamadas) y recorren recursivamente todos los objetos accesibles desde estas raíces. Los objetos inaccesibles se consideran basura.
- Estrategias principales de rastreo:
- Marcar y Barrer (Mark and Sweep):
- Marcar (Mark): Recorrido por el grafo de objetos, marcando todos los objetos accesibles.
- Barrer (Sweep): Segundo recorrido por la memoria, eliminando todos los objetos no marcados.
- Desventajas: Fragmentación de memoria.
- Marcar y Compactar (Mark and Compact):
- Marcar (Mark): Como en Mark and Sweep.
- Compactar (Compact): Mueve los objetos vivos para que estén en posiciones contiguas, eliminando la fragmentación.
- Desventajas: Más complejo, puede requerir detener la ejecución del programa.
- Copiar (Copying): Divide la memoria en dos áreas (semiespacios). En cada ciclo de recolección, los objetos vivos de un área se copian a la otra. Luego, el área antigua se limpia completamente.
- Ventajas: Sin fragmentación, asignación rápida de memoria después de la recolección.
- Desventajas: Requiere el doble de memoria en comparación con la memoria activa.
- Marcar y Barrer (Mark and Sweep):
- Estrategias principales de rastreo:
- Recolección de basura generacional (Generational Garbage Collection): Basada en la hipótesis de que la mayoría de los objetos no viven mucho tiempo. La memoria se divide en generaciones (joven, vieja). Los objetos se colocan en la generación joven al crearlos. Si un objeto sobrevive varias recolecciones en la generación joven, se traslada a la generación vieja. La recolección ocurre con más frecuencia en la generación joven.
- Ventajas: Eficiente, ya que la mayor parte del trabajo se realiza en la generación joven con menos datos.
- Desventajas: Requiere seguimiento de referencias de las generaciones viejas a las jóvenes (tarjetas de registro u otros mecanismos).
Ejemplos de lenguajes y sus GC:
- Python: Contador de referencias (con recolección cíclica para referencias cíclicas).
- Java, C#: Generacional, Marcar y Barrer, Marcar y Compactar, Copiar (varios enfoques y combinaciones dependiendo de la versión y configuración específica de JVM/.NET).
- Go: Concurrente, no generacional, Marcar y Barrer con optimizaciones.