Articulo de referencia

Recogida de basura (informática)

Recolección de basura de parada y copia en una arquitectura Lisp : [ 1 ] La memoria se divide en memoria de trabajo y memoria libre ; los nuevos objetos se asignan en la primera...

Recolección de basura de parada y copia en una arquitectura Lisp : [ 1 ] La memoria se divide en memoria de trabajo y memoria libre ; los nuevos objetos se asignan en la primera. Cuando está llena (representada), se realiza la recolección de basura: todas las estructuras de datos que aún están en uso se localizan mediante el rastreo de punteros y se copian en ubicaciones consecutivas en la memoria libre.
Después de eso, el contenido de la memoria de trabajo se descarta en favor de la copia compactada, y se intercambian las funciones de la memoria de trabajo y la memoria libre (como se muestra).

En informática , la recolección de basura ( GC ) es una forma de gestión automática de memoria . [ 2 ] El recolector de basura intenta recuperar la memoria que fue asignada por el programa, pero que ya no se utiliza; dicha memoria se denomina basura . La recolección de basura fue inventada por el informático estadounidense John McCarthy alrededor de 1959 para simplificar la gestión manual de memoria en Lisp . [ 3 ]

La recolección de basura libera al programador de la gestión manual de la memoria , donde este especifica qué objetos liberar y devolver al sistema de memoria, y cuándo hacerlo. [ 2 ] Otras técnicas similares incluyen la asignación de pila , la inferencia de regiones y la propiedad de la memoria, así como combinaciones de estas. La recolección de basura puede consumir una proporción significativa del tiempo total de procesamiento de un programa y, en consecuencia, afectar su rendimiento .

Los recursos distintos de la memoria, como los sockets de red , los identificadores de bases de datos , las ventanas , los descriptores de archivos y los descriptores de dispositivos, no suelen ser gestionados por la recolección de basura, sino por otros métodos (por ejemplo, destructores ). Algunos de estos métodos también liberan memoria.

Descripción general

Muchos lenguajes de programación requieren recolección de basura, ya sea como parte de la especificación del lenguaje (por ejemplo, RPL , Java , C# , D , [ 4 ] Go y la mayoría de los lenguajes de scripting ) o efectivamente para la implementación práctica (por ejemplo, lenguajes formales como el cálculo lambda ). [ 5 ] Se dice que estos son lenguajes con recolección de basura . Otros lenguajes, como C y C++ , fueron diseñados para usarse con administración manual de memoria, pero tienen implementaciones con recolección de basura disponibles. Algunos lenguajes, como Ada , Modula-3 y C++/CLI , permiten que tanto la recolección de basura como la administración manual de memoria coexistan en la misma aplicación mediante el uso de montones separados para objetos recolectados y administrados manualmente. Otros, como D , tienen recolección de basura, pero permiten al usuario eliminar manualmente objetos o incluso deshabilitar la recolección de basura por completo cuando se requiere velocidad. [ 6 ]

Aunque muchos lenguajes integran el recolector de basura (GC) en su compilador y sistema de tiempo de ejecución , también existen sistemas de GC post-hoc , como el conteo automático de referencias (ARC). Algunos de estos sistemas de GC post-hoc no requieren recompilación. [ 7 ]

Ventajas

El recolector de basura libera al programador de la necesidad de liberar manualmente la memoria. Esto ayuda a evitar algunos tipos de errores : [ 8 ]

  • Punteros colgantes , que ocurren cuando se libera una porción de memoria mientras aún existen punteros que apuntan a ella, y uno de esos punteros se desreferencia . Para entonces, la memoria puede haber sido reasignada a otro uso, con resultados impredecibles. [ 9 ]
  • Errores de doble liberación , que ocurren cuando el programa intenta liberar una región de memoria que ya ha sido liberada y, posiblemente, ya ha sido asignada de nuevo.
  • Ciertos tipos de fugas de memoria , en las que un programa no logra liberar la memoria ocupada por objetos que se han vuelto inaccesibles , pueden provocar un agotamiento de la memoria. [ 10 ]

Desventajas

GC utiliza recursos informáticos para decidir qué memoria liberar. Por lo tanto, la penalización por la comodidad de no anotar manualmente la vida útil de los objetos en el código fuente es una sobrecarga , que puede perjudicar el rendimiento del programa. [ 11 ] Un artículo revisado por pares de 2005 concluyó que GC necesita cinco veces más memoria para compensar esta sobrecarga y funcionar tan rápido como el mismo programa utilizando una gestión de memoria explícita idealizada. Sin embargo, la comparación se realiza con un programa generado insertando llamadas de desasignación usando un oráculo , implementado mediante la recopilación de trazas de programas ejecutados bajo un perfilador , y el programa solo es correcto para una ejecución particular del programa. [ 12 ] La interacción con los efectos de la jerarquía de memoria puede hacer que esta sobrecarga sea intolerable en circunstancias que son difíciles de predecir o detectar en las pruebas rutinarias. Apple dio el impacto en el rendimiento como una razón para no adoptar la recolección de basura en iOS , a pesar de ser la característica más deseada. [ 13 ]

El momento en que se recoge la basura puede ser impredecible, lo que provoca pausas (debido a la liberación de memoria) a lo largo de la sesión . Estas pausas impredecibles pueden ser inaceptables en entornos en tiempo real , en el procesamiento de transacciones o en programas interactivos. Los recolectores de basura incrementales, concurrentes y en tiempo real abordan estos problemas, con diferentes ventajas e inconvenientes.

Estrategias

Rastreo

La recolección de basura por rastreo es el tipo más común de recolección de basura, tanto que el término "recolección de basura" a menudo se refiere a este método, en lugar de otros como el conteo de referencias . La estrategia general consiste en determinar qué objetos deben ser recolectados rastreando cuáles son accesibles mediante una cadena de referencias desde ciertos objetos raíz, y considerando el resto como basura y recolectándolos. [ 14 ] Sin embargo, existe una gran cantidad de algoritmos utilizados en la implementación, con características de complejidad y rendimiento muy variables.

Conteo de referencias

La recolección de basura por conteo de referencias consiste en que cada objeto tiene un contador que indica el número de referencias que recibe. La basura se identifica por tener un contador de referencias de cero. El contador de referencias de un objeto se incrementa cuando se crea una referencia a él y se decrementa cuando se destruye una referencia. Cuando el contador llega a cero, se recupera la memoria del objeto. [ 15 ]

Al igual que con la gestión manual de la memoria, y a diferencia de la recolección de basura por rastreo, el conteo de referencias garantiza que los objetos se destruyan tan pronto como se destruya su última referencia, y generalmente solo accede a la memoria que se encuentra en las cachés de la CPU , en objetos que se van a liberar o a la que apuntan directamente estos, por lo que tiende a no tener efectos secundarios negativos significativos en el funcionamiento de la caché de la CPU y la memoria virtual .

El conteo de referencias presenta varias desventajas; esto generalmente se puede solucionar o mitigar mediante algoritmos más sofisticados:

Ciclos
Si dos o más objetos se referencian entre sí, pueden crear un ciclo en el que ninguno será recolectado ya que sus referencias mutuas nunca permiten que sus contadores de referencia lleguen a cero. Algunos sistemas de recolección de basura que utilizan el conteo de referencias (como el de CPython ) utilizan algoritmos específicos de detección de ciclos para abordar este problema. [ 16 ] Otra estrategia es usar referencias débiles para los "backpointers" que crean ciclos. Bajo el conteo de referencias, una referencia débil es similar a una referencia débil bajo un recolector de basura de rastreo. Es un objeto de referencia especial cuya existencia no incrementa el contador de referencias del objeto de referencia. Además, una referencia débil es segura en el sentido de que cuando el objeto de referencia se convierte en basura, cualquier referencia débil a él caduca , en lugar de permitirse que permanezca colgante, lo que significa que se convierte en un valor predecible, como una referencia nula.
Espacio sobrante (recuento de referencias)
El conteo de referencias requiere que se asigne espacio para cada objeto para almacenar su contador de referencias. El contador puede almacenarse adyacente a la memoria del objeto o en una tabla lateral en otro lugar, pero en cualquier caso, cada objeto con conteo de referencias requiere almacenamiento adicional para su contador de referencias. El espacio de memoria del tamaño de un puntero sin signo se usa comúnmente para esta tarea, lo que significa que se deben asignar 32 o 64 bits de almacenamiento de conteo de referencias para cada objeto. En algunos sistemas, puede ser posible mitigar esta sobrecarga usando un puntero etiquetado para almacenar el conteo de referencias en áreas no utilizadas de la memoria del objeto. A menudo, una arquitectura no permite que los programas accedan al rango completo de direcciones de memoria que podrían almacenarse en el tamaño nativo de su puntero; una cierta cantidad de bits altos en la dirección se ignora o se requiere que sea cero. Si un objeto tiene de manera confiable un puntero en una ubicación determinada, el conteo de referencias se puede almacenar en los bits no utilizados del puntero. Por ejemplo, cada objeto en Objective-C tiene un puntero a su clase al principio de su memoria; En la arquitectura ARM64 que utiliza iOS 7 , 19 bits no utilizados de este puntero de clase se utilizan para almacenar el contador de referencias del objeto. [ 17 ] [ 18 ]
Incremento/decremento de velocidad
En implementaciones ingenuas, cada asignación de una referencia y cada referencia que sale del ámbito a menudo requiere modificaciones de uno o más contadores de referencias. Sin embargo, en un caso común, cuando una referencia se copia de una variable de ámbito externo a una variable de ámbito interno, de manera que la vida útil de la variable interna está limitada por la vida útil de la externa, se puede eliminar el incremento de la referencia. La variable externa "posee" la referencia. En el lenguaje de programación C++, esta técnica se implementa fácilmente y se demuestra con el uso de constreferencias. El conteo de referencias en C++ generalmente se implementa usando " punteros inteligentes " [ 19 ] cuyos constructores, destructores y operadores de asignación administran las referencias. Un puntero inteligente se puede pasar por referencia a una función, lo que evita la necesidad de copiar un nuevo puntero inteligente (lo que aumentaría el contador de referencias al entrar en la función y lo disminuiría al salir). En cambio, la función recibe una referencia al puntero inteligente que se produce de forma económica. El método Deutsch-Bobrow de conteo de referencias aprovecha el hecho de que la mayoría de las actualizaciones del contador de referencias son generadas por referencias almacenadas en variables locales. Ignora estas referencias, solo cuenta las referencias en el montón, pero antes de que se pueda eliminar un objeto con contador de referencias cero, el sistema debe verificar con un escaneo de la pila y el registro que no exista ninguna otra referencia a él. Se puede obtener una disminución sustancial adicional en la sobrecarga en las actualizaciones del contador mediante la coalescencia de actualizaciones introducida por Levanoni y Petrank . [ 20 ] [ 21 ] Considere un puntero que en un intervalo dado de la ejecución se actualiza varias veces. Primero apunta a un objeto O1, luego a un objeto O2, y así sucesivamente hasta que al final del intervalo apunta a algún objeto On. Un algoritmo de conteo de referencias normalmente ejecutaría rc(O1)--, rc(O2)++, rc(O2)--, rc(O3)++, rc(O3)--, ..., rc(On)++. Pero la mayoría de estas actualizaciones son redundantes. Para que el contador de referencias se evalúe correctamente al final del intervalo, es suficiente con realizar rc(O1)--y rc(On)++. Levanoni y Petrank midieron una eliminación de más del 99% de las actualizaciones del contador en los benchmarks típicos de Java.
Requiere atomicidad
Cuando se utilizan en un entorno multihilo , estas modificaciones (incremento y decremento) pueden necesitar ser operaciones atómicas como comparar e intercambiar , al menos para cualquier objeto que sea compartido, o potencialmente compartido entre múltiples hilos. Las operaciones atómicas son costosas en un multiprocesador, y aún más costosas si tienen que ser emuladas con algoritmos de software. Es posible evitar este problema agregando contadores de referencias por hilo o por CPU y accediendo al contador de referencias global solo cuando los contadores de referencias locales se vuelven o dejan de ser cero (o, alternativamente, usando un árbol binario de contadores de referencias, o incluso renunciando a la destrucción determinista a cambio de no tener ningún contador de referencias global), pero esto agrega una sobrecarga de memoria significativa y, por lo tanto, tiende a ser útil solo en casos especiales (se usa, por ejemplo, en el conteo de referencias de los módulos del kernel de Linux). La coalescencia de actualizaciones de Levanoni y Petrank [ 20 ] [ 21 ] puede usarse para eliminar todas las operaciones atómicas de la barrera de escritura. Los contadores nunca son actualizados por los hilos del programa durante su ejecución. Solo los modifica el recolector, que se ejecuta como un hilo adicional sin sincronización. Este método puede utilizarse como mecanismo de detención global para programas paralelos, así como con un recolector de conteo de referencias concurrente.
No es en tiempo real.
Las implementaciones simples de conteo de referencias generalmente no ofrecen un comportamiento en tiempo real, ya que cualquier asignación de puntero puede provocar la liberación recursiva de un número de objetos limitado únicamente por el tamaño total de la memoria asignada, mientras el hilo no puede realizar otras tareas. Es posible evitar este problema delegando la liberación de objetos sin referencias a otros hilos, aunque esto conlleva una sobrecarga adicional.

Análisis de escape

El análisis de escape es una técnica de compilación que permite convertir las asignaciones de memoria dinámica (heap) en asignaciones de memoria estática (stack) , reduciendo así la cantidad de recolección de basura necesaria. Este análisis determina si un objeto asignado dentro de una función es accesible fuera de ella. Si se detecta que una asignación local a una función es accesible desde otra función o hilo, se dice que la asignación "escapa" y no puede realizarse en la pila. De lo contrario, el objeto puede asignarse directamente en la pila y liberarse cuando la función finaliza, evitando así el heap y los costos de administración de memoria asociados. [ 22 ]

Disponibilidad

En general, los lenguajes de programación de alto nivel suelen incluir la recolección de basura como una característica estándar. En algunos lenguajes que carecen de recolección de basura integrada, esta se puede agregar mediante una biblioteca, como ocurre con el recolector de basura Boehm para C y C++.

La mayoría de los lenguajes de programación funcional , como ML , Haskell y APL , incorporan la recolección de basura. Lisp es especialmente notable por ser el primer lenguaje de programación funcional y el primero en introducir la recolección de basura. [ 23 ]

Otros lenguajes dinámicos, como Ruby y Julia (pero no Perl  5 ni PHP antes de la versión 5.3, [ 24 ] que usan conteo de referencias), JavaScript y ECMAScript también tienden a usar GC. Los lenguajes de programación orientados a objetos como Smalltalk , ooRexx , RPL y Java generalmente proporcionan recolección de basura integrada. Las excepciones notables son C++ y Delphi , que tienen destructores .

BÁSICO

BASIC y Logo a menudo han utilizado la recolección de basura para tipos de datos de longitud variable, como cadenas y listas, para no sobrecargar a los programadores con detalles de administración de memoria. En el Altair 8800 , los programas con muchas variables de cadena y poco espacio para cadenas podían causar largas pausas debido a la recolección de basura. [ 25 ] De manera similar, el algoritmo de recolección de basura del intérprete Applesoft BASIC escanea repetidamente los descriptores de cadena para encontrar la cadena con la dirección más alta con el fin de compactarla hacia la memoria alta, lo que resulta enO(norte2){\displaystyle O(n^{2})}rendimiento [ 26 ] y pausas de unos pocos segundos a unos pocos minutos. [ 27 ] Un recolector de basura de reemplazo para Applesoft BASIC por Randy Wigginton identifica un grupo de cadenas en cada pasada sobre el montón, reduciendo drásticamente el tiempo de recolección. [ 28 ] BASIC.SYSTEM, lanzado con ProDOS en 1983 proporciona un recolector de basura de ventana para BASIC que es muchas veces más rápido. [ 29 ]

C y C++

C nunca ha ofrecido soporte oficial para la recolección de basura. C++ añadió soporte para la recolección de basura en C++11 a la biblioteca estándar; sin embargo, esto se eliminó en C++23 debido a que ningún compilador implementó soporte para la característica. [ 30 ] Las características que formaban parte de esto estaban relacionadas con la seguridad de los punteros. [ 31 ]

Aunque se eliminó la compatibilidad con la recolección de basura en la biblioteca estándar, todavía se pueden usar algunos recolectores de basura como el recolector de basura Boehm (para C y C++). Boehm GC utiliza la recolección de basura con rastreo . También se puede usar en modo de detección de fugas, donde la administración de memoria sigue siendo manual, pero se pueden detectar y reportar fugas y errores de doble liberación. Su uso se puede llamar desde el encabezado <gc.h>.

En C++, aún se pueden abstraer las destrucciones manuales de objetos mediante el uso del patrón " adquisición de recursos es inicialización " (RAII) y punteros inteligentes . std::unique_ptrvincula la vida útil a la propiedad, mientras que std::shared_ptrutiliza el conteo de referencias para determinar la vida útil. std::weak_ptrse puede usar para obtener un puntero sin aumentar el contador de referencias. A diferencia de la recolección de basura, RAII es determinista.

Objetivo-C

Aunque Objective-C tradicionalmente no tenía recolección de basura, con el lanzamiento de OS X 10.5 en 2007, Apple introdujo la recolección de basura para Objective-C  2.0, utilizando un recolector de tiempo de ejecución desarrollado internamente. [ 32 ] Sin embargo, con el lanzamiento de OS X 10.8 en 2012 , la recolección de basura quedó obsoleta en favor del contador de referencias automático (ARC) de LLVM , que se introdujo con OS X 10.7 . [ 33 ] Además, desde mayo de 2015, Apple incluso prohibió el uso de la recolección de basura para las nuevas aplicaciones de OS X en la App Store . [ 34 ] [ 35 ] Para iOS , la recolección de basura nunca se ha introducido debido a problemas en la capacidad de respuesta y el rendimiento de las aplicaciones; [ 13 ] [ 36 ] en su lugar, iOS utiliza ARC. [ 37 ] [ 38 ] 

Entornos limitados

La recolección de basura rara vez se utiliza en sistemas embebidos o en tiempo real debido a la necesidad habitual de un control muy estricto sobre el uso de recursos limitados. Sin embargo, se han desarrollado recolectores de basura compatibles con muchos entornos limitados. [ 39 ] Microsoft .NET Micro Framework , .NET nanoFramework [ 40 ] y Java Platform, Micro Edition son plataformas de software embebido que, al igual que sus versiones más grandes, incluyen recolección de basura.

Java

Los recolectores de basura disponibles en la máquina virtual (JVM) de Java OpenJDK incluyen:

  • De serie
  • Paralelo
  • CMS (Barrido de Marcas Concurrente)
  • G1 (Primero la basura)
  • ZGC (Recolector de basura Z)
  • Épsilon
  • Shenandoah
  • GenZGC (Generación ZGC)
  • GenShen (Shenandoah generacional)
  • Metrónomo de IBM (solo en IBM OpenJDK)
  • SAP (solo en SAP OpenJDK)
  • Azul C4 (Recolector de compactación concurrente continua) [ 41 ] (solo en Azul Systems OpenJDK)

Uso en tiempo de compilación

La recolección de basura en tiempo de compilación es una forma de análisis estático que permite reutilizar y recuperar la memoria basándose en invariantes conocidas durante la compilación.

Esta forma de recolección de basura se ha estudiado en el lenguaje de programación Mercury , [ 42 ] y tuvo un mayor uso con la introducción del contador de referencias automático (ARC) de LLVM en el ecosistema de Apple (iOS y OS X) en 2011. [ 37 ] [ 38 ] [ 34 ] 

Sistemas en tiempo real

Se han desarrollado recolectores de basura incrementales, concurrentes y en tiempo real, por ejemplo por Henry Baker y por Henry Lieberman . [ 43 ] [ 44 ] [ 45 ]

En el algoritmo de Baker, la asignación se realiza en una de las dos mitades de una única región de memoria. Cuando esta se llena a la mitad, se ejecuta una recolección de basura que mueve los objetos activos a la otra mitad, mientras que los objetos restantes se desasignan implícitamente. El programa en ejecución (el "mutador") debe verificar que cualquier objeto al que haga referencia se encuentre en la mitad correcta y, de no ser así, moverlo a la otra mitad, mientras una tarea en segundo plano busca todos los objetos. [ 46 ]

Los esquemas de recolección de basura generacional se basan en la observación empírica de que la mayoría de los objetos mueren jóvenes. En la recolección de basura generacional, se mantienen dos o más regiones de asignación (generaciones), separadas según la antigüedad del objeto. Los objetos nuevos se crean en la generación "joven", que se recolecta regularmente, y cuando una generación está llena, los objetos que aún se referencian desde regiones más antiguas se copian a la siguiente generación más antigua. Ocasionalmente, se realiza un escaneo completo.

Algunas arquitecturas informáticas de lenguajes de alto nivel incluyen soporte de hardware para la recolección de basura en tiempo real.

La mayoría de las implementaciones de recolectores de basura en tiempo real utilizan rastreo . Dichos recolectores de basura en tiempo real cumplen con las estrictas restricciones de tiempo real cuando se utilizan con un sistema operativo en tiempo real. [ 47 ]

Véase también

Referencias

  1. Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (2016). Estructura e interpretación de programas informáticos (PDF) (2.ª  ed.). Cambridge, Massachusetts, EE. UU.: MIT Press . págs. 734–736 . 
  2. 1 2 "¿Qué es la recolección de basura (GC) en programación?" . Almacenamiento . Recuperado el 21-06-2024 .
  3. McCarthy, John (1960). "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, Parte I" . Communications of the ACM . 3 (4): 184– 195. doi : 10.1145/367177.367199 . S2CID 1489409. Consultado el 29 de mayo de 2009 . 
  4. "Descripción general – Lenguaje de programación D" . dlang.org . Digital Mars . Consultado el 29 de julio de 2014 .
  5. Heller, Martin (2023-02-03). "¿Qué es la recolección de basura? Gestión automatizada de memoria para sus programas" . InfoWorld . Recuperado el 2024-06-21 .
  6. "Una guía para la recolección de basura en programación" . freeCodeCamp.org . 16 de enero de 2020. Consultado el 21 de junio de 2024 .
  7. "Recolección de basura - Lenguaje de programación D" . dlang.org . Consultado el 17 de octubre de 2022 .
  8. "Recogida de basura" . rebelsky.cs.grinnell.edu . Consultado el 13 de enero de 2024 .
  9. Heller, Martin (2023-02-03). "¿Qué es la recolección de basura? Gestión automatizada de memoria para sus programas" . InfoWorld . Recuperado el 2024-06-21 .
  10. Microsoft (28 de febrero de 2023). "Fundamentos de la recolección de basura | Microsoft Learn" . Consultado el 29 de marzo de 2023 .
  11. Zorn, Benjamin (1993-01-22). "El costo medido de la recolección de basura conservadora". Software: Práctica y experiencia . 23 (7). Departamento de Ciencias de la Computación, Universidad de Colorado Boulder : 733–756 . CiteSeerX 10.1.1.14.1816 . doi : 10.1002/spe.4380230704 . S2CID 16182444 .  
  12. Hertz, Matthew; Berger, Emery D. (2005). "Cuantificación del rendimiento de la recolección de basura frente a la gestión explícita de memoria" (PDF) . Actas de la 20.ª Conferencia Anual ACM SIGPLAN sobre Programación Orientada a Objetos, Sistemas, Lenguajes y Aplicaciones - OOPSLA '05 . págs. 313–326 . doi : 10.1145/1094811.1094836 . ISBN  1-59593031-0. S2CID 6570650 . Archivado (PDF) del original el 2 de abril de 2012 . Recuperado el 15 de marzo de 2015 . 
  13. 1 2 "Inicio de herramientas para desarrolladores – sesión 300" (PDF) . WWDC 2011. Apple, Inc. 24 de junio de 2011. Archivado del original (PDF) el 4 de septiembre de 2023. Recuperado el 27 de marzo de 2015 .
  14. "Una teoría unificada de la recolección de basura" . www.cs.cornell.edu . 8 de noviembre de 2019. Consultado el 22 de abril de 2026 .
  15. Microsoft (27 de enero de 2009). "Recolección de basura mediante conteo de referencias" . Recuperado el 29 de marzo de 2023 .
  16. "Recuentos de referencias" . Ampliación e integración del intérprete de Python . 21/02/2008 . Consultado el 22/05/2014 .
  17. Ash, Mike. "Preguntas y respuestas del viernes 27/09/2013: ARM64 y usted" . mikeash.com . Consultado el 27/04/2014 .
  18. "Hamster Emporium: [ objc explain ] : Non-pointer isa" . Sealiesoftware.com. 24-09-2013 . Consultado el 27-04-2014 .
  19. ^ Pibinger, Roland (3 de mayo de 2005) [17 de abril de 2005]. "RAII, objetos dinámicos y fábricas en C++" .
  20. 1 2 Levanoni, Yossi; Petrank, Erez (2001). "Un recolector de basura de conteo de referencias sobre la marcha para Java" . Actas de la 16.ª Conferencia ACM SIGPLAN sobre Programación Orientada a Objetos, Sistemas, Lenguajes y Aplicaciones . OOPSLA 2001. págs. 367–380 . doi : 10.1145/504282.504309 . 
  21. 1 2 Levanoni, Yossi; Petrank, Erez (2006). "Un recolector de basura de conteo de referencias sobre la marcha para Java" . ACM Trans. Program. Lang. Syst . 28 : 31–69 . CiteSeerX 10.1.1.15.9106 . doi : 10.1145/1111596.1111597 . S2CID 14777709 .  
  22. Salagnac, Guillaume; Yovine, Sergio; Garbervetsky, Diego (2005-05-24). "Análisis de escape rápido para la gestión de memoria basada en regiones" . Electronic Notes in Theoretical Computer Science . 131 : 99–110 . doi : 10.1016/j.entcs.2005.01.026 .
  23. Chisnall, David (2011-01-12). Lenguajes de programación influyentes, parte 4: Lisp .
  24. "PHP: Consideraciones de rendimiento" . php.net . Consultado el 14 de enero de 2015 .
  25. "Manual de referencia básico 4.1 de Altair 8800" (PDF) . Archivo digital de tecnología vintage . Abril de 1977. pág. 108. Archivado (PDF) del original el 29 de junio de 2021. Consultado el 29 de junio de 2021 . 
  26. "Hice algunos trabajos para acelerar la recolección de basura de cadenas en Applesoft..." Hacker News . Consultado el 29 de junio de 2021 .
  27. Little, Gary B. (1985). Inside the Apple IIc . Bowie, Md.: Brady Communications Co. p. 82. ISBN  0-89303-564-5. Consultado el 29 de junio de 2021 .
  28. "Recogida rápida de basura". Llamada a APPLE : 40–45 . Enero de 1981.
  29. Worth, Don (1984). Beneath Apple Pro DOS (PDF) (edición impresa de marzo de 1985 ). Chatsworth, California, EE. UU.: Quality Software. págs. 2–6 . ISBN   0-912985-05-4. Archivado (PDF) del original el 03-12-2008 . Consultado el 29-06-2021 .
  30. JF Bastien; Alisdair Meredith (16 de abril de 2021). "Eliminación del soporte para la recolección de basura" .
  31. "std::pointer_safety - cppreference.com" . en.cppreference.com . Consultado el 09-12-2024 .
  32. "Introducción a Objective-C 2.0" . Archivado del original el 24 de julio de 2010.
  33. Siracusa, John (2011-07-20). "Mac OS X 10.7 Lion: la reseña de Ars Technica" .
  34. 1 2 "Apple dice que los creadores de aplicaciones para Mac deben migrar a la gestión de memoria ARC antes de mayo" . AppleInsider . 2015-02-20.
  35. ^ Cichón, Waldemar (21 de febrero de 2015). "App Store: programa exclusivo de Apple con recolección de basura" . Heise.de . Consultado el 30 de marzo de 2015 .
  36. Silva, Precious (18 de noviembre de 2014). "iOS 8 vs Android 5.0 Lollipop: Apple supera a Google con eficiencia de memoria" . International Business Times . Archivado del original el 3 de abril de 2015. Consultado el 7 de abril de 2015 .
  37. 1 2 Napier, Rob; Kumar, Mugunth (2012-11-20). Programación de iOS 6: Superando los límites . John Wiley & Sons . ISBN 978-1-11844997-4. Consultado el 30 de marzo de 2015 .
  38. 1 2 Cruz, José RC (22-05-2012). "Conteo automático de referencias en iOS" . Dr. Dobbs . Archivado del original el 16-05-2020 . Recuperado el 30-03-2015 .
  39. Fu, Wei; Hauser, Carl (2005). "Un marco de recolección de basura en tiempo real para sistemas embebidos". Actas del Taller de 2005 sobre Software y Compiladores para Sistemas Embebidos - SCOPES '05 . págs. 20–26 . doi : 10.1145/1140389.1140392 . ISBN  1-59593207-0. S2CID 8635481 . 
  40. ".NET nanoFramework" .
  41. Tene, Gil; Iyengar, Balaji; Wolf, Michael (2011). "C4: el recolector de compactación concurrente continuo" (PDF) . ISMM '11: Actas del simposio internacional sobre gestión de memoria . doi : 10.1145/1993478 . ISBN 978-1-45030263-0Archivado (PDF) del original el 9 de agosto de 2017 .
  42. Mazur, Nancy (mayo de 2004). Recolección de basura en tiempo de compilación para el lenguaje declarativo Mercury (PDF) (Tesis). Katholieke Universiteit Leuven . Archivado (PDF) del original el 27 de abril de 2014.
  43. Huelsbergen, Lorenz; Winterbottom, Phil (1998). "Recolección de basura de marcado y barrido muy concurrente sin sincronización de grano fino" (PDF) . Actas del Primer Simposio Internacional sobre Gestión de Memoria - ISMM '98 . págs. 166–175 . doi : 10.1145/286860.286878 . ISBN  1-58113114-3. S2CID 14399427 . Archivado (PDF) del original el 13-05-2008. 
  44. "Preguntas frecuentes de GC" .
  45. Lieberman, Henry; Hewitt, Carl (1983). "Un recolector de basura en tiempo real basado en la vida útil de los objetos" . Communications of the ACM . 26 (6): 419– 429. doi : 10.1145/358141.358147 . hdl : 1721.1/6335 . S2CID 14161480 . 
  46. Baker, Henry G. (1978). "Procesamiento de listas en tiempo real en una computadora serial". Communications of the ACM . 21 (4): 280– 294. doi : 10.1145/359460.359470 . hdl : 1721.1/41976 . S2CID 17661259 . véase también la descripción
  47. McCloskey; Bacon; Cheng; Grove (2008), Staccato: Un recolector de basura compactador en tiempo real, paralelo y concurrente para multiprocesadores (PDF) , archivado (PDF) del original el 11 de marzo de 2014

Lecturas adicionales

  • Jones, Richard; Hosking, Antony; Moss, J. Eliot B. (16 de agosto de 2011). The Garbage Collection Handbook: The Art of Automatic Memory Management . CRC Applied Algorithms and Data Structures Series. Chapman and Hall / CRC Press / Taylor & Francis Ltd. ISBN 978-1-4200-8279-1.(511 páginas)
  • Jones, Richard; Lins, Rafael (12 de julio de 1996). Recolección de basura: algoritmos para la gestión automática de memoria dinámica (1.ª  ed.). Wiley . ISBN 978-0-47194148-4.(404 páginas)
  • Schorr, Herbert; Waite, William M. (agosto de 1967). "Un procedimiento eficiente e independiente de la máquina para la recolección de basura en diversas estructuras de lista" ( PDF) . Communications of the ACM . 10 (8): 501– 506. doi : 10.1145/363534.363554 . S2CID 5684388. Archivado (PDF) del original el 22 de enero de 2021. 
  • Wilson, Paul R. (1992). "Técnicas de recolección de basura en uniprocesadores". Gestión de memoria . Notas de clase en ciencias de la computación. Vol.  637. Springer-Verlag . págs. 1–42 . CiteSeerX 10.1.1.47.2438 . doi : 10.1007/bfb0017182 . ISBN   3-540-55940-X.{{cite book}}: |journal=ignorado ( ayuda )
  • Wilson, Paul R.; Johnstone, Mark S.; Neely, Michael; Boles, David (1995). «Asignación dinámica de almacenamiento: una revisión y análisis crítico». Memory Management . Lecture Notes in Computer Science. Vol.  986 (1.ª  ed.). pp. 1–116 . CiteSeerX 10.1.1.47.275 . doi : 10.1007/3-540-60368-9_19 . ISBN   978-3-540-60368-9.{{cite book}}: |journal=ignorado ( ayuda )
  • Referencia de gestión de memoria archivada el 13/12/2020 en Wayback Machine .
  • Conceptos básicos de la recolección de basura
  • Optimización de la recolección de basura de la máquina virtual HotSpot de Java SE 6
  • TinyGC: una implementación independiente de la API de BoehmGC.
  • Implementación conservadora de recolección de basura para el lenguaje C
  • MeixnerGC: un recolector de basura incremental de marcado y barrido para C++ que utiliza punteros inteligentes.