De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

Recolección de basura de detener y copiar en una arquitectura Lisp : [1] La memoria se divide en memoria de trabajo y memoria libre ; en el primero se asignan nuevos objetos ( pares de contras ). Cuando está lleno (representado), se realiza la recolección de basura: todas las estructuras de datos que todavía están en uso se ubican 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 comprimida, y se intercambian (representa) el papel de la memoria de trabajo y la memoria libre .

En informática , la recolección de basura ( GC ) es una forma de gestión automática de la memoria . El recolector de basura , o simplemente colector , los intentos de recuperar la basura , o la memoria ocupados por objetos que ya no están en uso por el programa . La recolección de basura fue inventada por el científico informático estadounidense John McCarthy alrededor de 1959 para simplificar la gestión manual de la memoria en Lisp . [2]

La recolección de basura libera al programador de realizar una administración de memoria manual donde el programador especifica qué objetos desasignar y regresar al sistema de memoria y cuándo hacerlo. Otras técnicas similares incluyen asignación de pila , inferencia de región , propiedad de memoria y combinaciones de múltiples técnicas. La recolección de basura puede tomar una proporción significativa del tiempo total de procesamiento en un programa y, como resultado, puede tener una influencia significativa en el rendimiento .

Los recursos distintos de la memoria, como los enchufes de red , los identificadores de bases de datos , las ventanas de interacción del usuario , los descriptores de archivos y dispositivos, no suelen manejarse mediante la recolección de basura. Los métodos para administrar dichos recursos, en particular los destructores , pueden ser suficientes para administrar la memoria también, sin dejar necesidad de GC. Algunos sistemas de GC permiten que otros recursos se asocien con una región de memoria que, cuando se recopila, provoca el trabajo de recuperar estos recursos.

Principios [ editar ]

Los principios básicos de la recolección de basura son encontrar objetos de datos en un programa al que no se puede acceder en el futuro y recuperar los recursos utilizados por esos objetos.

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

Si bien la integración de recolección de basura en el compilador del lenguaje y el sistema de tiempo de ejecución permite una elección mucho más amplia de métodos, existen [ cita requerida ] sistemas GC post-hoc , como el Conteo automático de referencias (ARC), incluidos algunos que no requieren recompilación. ( La GC post-hoc a veces se distingue como recolección de basura ). El recolector de basura casi siempre estará integrado de cerca con el asignador de memoria .

Ventajas [ editar ]

La recolección de basura libera al programador de desasignar manualmente la memoria. Esto elimina o reduce algunas categorías de errores :

  • Punteros colgantes , que se producen cuando se libera un fragmento de memoria cuando todavía hay punteros hacia él, y uno de esos punteros se desreferencia . Para entonces, la memoria puede haber sido reasignada a otro uso, con resultados impredecibles.
  • Errores libres dobles , que ocurren cuando el programa intenta liberar una región de memoria que ya ha sido liberada, y quizás ya haya sido asignada nuevamente.
  • Ciertos tipos de pérdidas de memoria , en las que un programa no logra liberar memoria ocupada por objetos que se han vuelto inalcanzables , lo que puede llevar al agotamiento de la memoria.

Desventajas [ editar ]

La recolección de basura consume recursos informáticos para decidir qué memoria liberar, aunque el programador ya conozca esta información. La penalización por la conveniencia de no anotar la vida útil del objeto manualmente en el código fuente es la sobrecarga , lo que puede provocar una disminución o un rendimiento desigual. [4] Un artículo revisado por pares de 2005 llegó a la conclusión de que GC necesita cinco veces más memoria para compensar esta sobrecarga y funcionar tan rápido como la gestión de memoria explícita. [5] La interacción con los efectos de la jerarquía de la memoria puede hacer que esta sobrecarga sea intolerable en circunstancias que son difíciles de predecir o de detectar en las pruebas de rutina. Apple también dio el impacto en el rendimiento como una razón para no adoptar la recolección de basura en iOSa pesar de ser la característica más deseada. [6]

El momento en que la basura se recolecta realmente puede ser impredecible, lo que resulta en paradas (pausas para cambiar / liberar memoria) dispersas a lo largo de una sesión. Los atascos impredecibles pueden ser inaceptables en entornos de 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 compensaciones.

Las implementaciones modernas de GC intentan minimizar el bloqueo de paradas " stop-the-world " haciendo todo el trabajo posible en segundo plano (es decir, en un hilo separado), por ejemplo, marcando instancias de basura inalcanzables mientras el proceso de aplicación continúa ejecutándose. A pesar de estos avances, por ejemplo, en el paradigma .NET CLR sigue siendo muy difícil [¿ según quién? ] para mantener grandes montones (millones de objetos) con objetos residentes que se promocionan a generaciones anteriores sin incurrir en retrasos notables (a veces unos pocos segundos).

Estrategias [ editar ]

Rastreo [ editar ]

El seguimiento de la recolección de basura es el tipo más común de recolección de basura, tanto que "recolección de basura" a menudo se refiere al seguimiento de la recolección de basura, en lugar de otros métodos como el recuento de referencias . La estrategia general consiste en determinar qué objetos deben ser recolectados como basura rastreando qué objetos son accesibles por una cadena de referencias de ciertos objetos raíz, y considerando el resto como basura y recogiéndolos. Sin embargo, hay una gran cantidad de algoritmos utilizados en la implementación, con características de rendimiento y complejidad muy variables.

Recuento de referencias [ editar ]

La recolección de basura de recuento de referencias es donde cada objeto tiene un recuento del número de referencias a él. La basura se identifica con un recuento de referencia de cero. El recuento de referencias de un objeto se incrementa cuando se crea una referencia a él y se reduce cuando se destruye una referencia. Cuando el recuento llega a cero, se recupera la memoria del objeto. [7]

Al igual que con la gestión manual de memoria, y a diferencia del seguimiento de la recolección de basura, el recuento de referencias garantiza que los objetos se destruyan tan pronto como se destruya su última referencia y, por lo general, solo acceda a la memoria que se encuentra en las memorias caché de la CPU , en los objetos que se van a liberar o directamente apuntados por esos, y por lo tanto tiende a no tener efectos secundarios negativos significativos en la memoria caché de la CPU y el funcionamiento de la memoria virtual .

Hay una serie de desventajas en el recuento de referencias; esto generalmente se puede resolver o mitigar mediante algoritmos más sofisticados:

Ciclos
Si dos o más objetos se refieren entre sí, pueden crear un ciclo en el que ninguno de los dos se recopilará ya que sus referencias mutuas nunca permiten que sus recuentos de referencias se vuelvan cero. Algunos sistemas de recolección de basura que usan el conteo de referencias (como el de CPython ) usan algoritmos específicos de detección de ciclos para lidiar con este problema. [8] Otra estrategia es utilizar referencias débiles para los "backpointers" que crean ciclos. En el recuento de referencias, una referencia débil es similar a una referencia débil en un recolector de basura de rastreo. Es un objeto de referencia especial cuya existencia no incrementa el recuento 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 que se le permita permanecer colgando, lo que significa que se convierte en un valor predecible, como una referencia nula.
Sobrecarga de espacio (recuento de referencias)
El recuento de referencias requiere que se asigne espacio para que cada objeto almacene su recuento de referencias. El recuento puede almacenarse junto a la memoria del objeto o en una mesa auxiliar en otro lugar, pero en cualquier caso, cada objeto con recuento de referencias requiere almacenamiento adicional para su recuento de referencias. El espacio de memoria con el tamaño de un puntero sin firmar se usa comúnmente para esta tarea, lo que significa que se deben asignar 32 o 64 bits de almacenamiento de recuento de referencia para cada objeto. En algunos sistemas, es posible mitigar esta sobrecarga mediante el uso de un puntero etiquetadopara almacenar el recuento de referencias en áreas no utilizadas de la memoria del objeto. A menudo, una arquitectura no permite que los programas accedan a la gama completa de direcciones de memoria que podrían almacenarse en su tamaño de puntero nativo; cierto número de bits altos en la dirección se ignora o se requiere que sea cero. Si un objeto tiene un puntero de manera confiable en una ubicación determinada, el recuento de referencia se puede almacenar en los bits no utilizados del puntero. Por ejemplo, cada objeto en Objective-C tiene un puntero a su clase al comienzo de su memoria; en la arquitectura ARM64 que utiliza iOS 7 , se utilizan 19 bits no utilizados de este puntero de clase para almacenar el recuento de referencias del objeto. [9] [10]
Sobrecarga de velocidad (incremento / decremento)
En implementaciones ingenuas, cada asignación de una referencia y cada referencia que cae fuera del alcance a menudo requieren modificaciones de uno o más contadores de referencia. Sin embargo, en el caso común, cuando se copia una referencia de una variable de alcance externo a una variable de alcance interno, de modo 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 y se demuestra fácilmente con el uso de constreferencias. El recuento de referencias en C ++ generalmente se implementa mediante " punteros inteligentes " [11]cuyos constructores, destructores y operadores de asignación gestionan las referencias. Se puede pasar un puntero inteligente por referencia a una función, lo que evita la necesidad de copiar-construir un nuevo puntero inteligente (lo que aumentaría el recuento de referencias al ingresar a la función y disminuirlo al salir). En cambio, la función recibe una referencia al puntero inteligente que se produce de forma económica. El método de recuento de referencias de Deutsch-Bobrow se basa en el hecho de que la mayoría de las actualizaciones de recuento de referencias son de hecho generadas por referencias almacenadas en variables locales. Ignora estas referencias, solo contando las referencias en el montón, pero antes de que se pueda eliminar un objeto con un recuento de referencia cero, el sistema debe verificar con un escaneo de la pila y registra que aún no existe ninguna otra referencia a él.Se puede obtener una disminución sustancial adicional en los gastos generales de las actualizaciones de mostrador mediante la fusión de actualizaciones introducida por Levanoni yPetrank . [12] [13] Considere un puntero que en un intervalo dado de 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 recuento de referencias típicamente ejecutar rc(O1)--, rc(O2)++, rc(O2)--, rc(O3)++, rc(O3)--, ..., rc(On)++. Pero la mayoría de estas actualizaciones son redundantes. Para que el recuento de referencia se evalúe correctamente al final del intervalo, es suficiente realizar rc(O1)--y rc(On)++. Levanoni y Petrank midieron una eliminación de más del 99% de las actualizaciones de contador en los puntos de referencia típicos de Java.
Requiere atomicidad
Cuando se utiliza en un entorno multiproceso , 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 subprocesos. Las operaciones atómicas son caras en un multiprocesador e incluso más caras si tienen que emularse con algoritmos de software. Es posible evitar este problema agregando recuentos de referencia por subproceso o por CPU y solo accediendo al recuento de referencia global cuando los recuentos de referencia local se vuelven o ya no son cero (o, alternativamente, utilizando un árbol binario de recuentos de referencia, o incluso renunciando a la destrucción determinista a cambio de no tener un recuento de referencia global en absoluto), 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 recuento de referencias de módulos del kernel de Linux ).
Actualización de la fusión de Levanoni y Petrank [12] [13]se puede utilizar para eliminar todas las operaciones atómicas de la barrera de escritura. Los subprocesos del programa nunca actualizan los contadores durante la ejecución del programa. Solo los modifica el recopilador, que se ejecuta como un único hilo adicional sin sincronización. Este método se puede utilizar como un mecanismo de parada mundial para programas paralelos, y también con un colector de recuento de referencias concurrente.
No en tiempo real
En general, las implementaciones ingenuas del recuento de referencias no proporcionan un comportamiento en tiempo real, porque cualquier asignación de puntero puede hacer que una cantidad de objetos limitados solo por el tamaño total de memoria asignada se libere de forma recursiva mientras el hilo no puede realizar otro trabajo. Es posible evitar este problema delegando la liberación de objetos cuyo recuento de referencias se redujo a cero a otros subprocesos, a costa de una sobrecarga adicional.

Análisis de escape [ editar ]

El análisis de escape es una técnica en tiempo de compilación que puede convertir asignaciones de montón en asignaciones de pila , lo que reduce la cantidad de recolección de basura que se debe realizar. Este análisis determina si un objeto asignado dentro de una función es accesible fuera de ella. Si se encuentra que una asignación local de función es accesible a otra función o subproceso, se dice que la asignación "escapa" y no se puede realizar en la pila. De lo contrario, el objeto puede asignarse directamente en la pila y liberarse cuando la función regrese, sin pasar por el montón y los costos asociados de administración de memoria. [14]

Disponibilidad [ editar ]

En términos generales, es más probable que los lenguajes de programación de nivel superior tengan la recolección de basura como característica estándar. En algunos lenguajes que no tienen recogida de basura incorporada, se puede agregar a través de una biblioteca, como con el recolector de basura de Boehm para C y C ++.

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

Otros lenguajes dinámicos, como Ruby y Julia (pero no Perl  5 o PHP antes de la versión 5.3, [16] que usan recuento de referencias), JavaScript y ECMAScript también tienden a usar GC. Los lenguajes de programación orientados a objetos, como Smalltalk y Java, suelen proporcionar una recogida de basura integrada. Las excepciones notables son C ++ y Delphi que tienen destructores .

BÁSICO [ editar ]

Históricamente, los lenguajes destinados a principiantes, como BASIC y Logo , a menudo han utilizado la recolección de basura para tipos de datos de longitud variable asignados al montón, como cadenas y listas, para no sobrecargar a los programadores con la administración manual de la memoria. En las primeras microcomputadoras, con su memoria limitada y procesadores lentos, la recolección de basura BASIC a menudo podía causar pausas aparentemente aleatorias e inexplicables en medio de la operación del programa.

Algunos intérpretes de BASIC, como Applesoft BASIC en la familia Apple II , escanearon repetidamente los descriptores de cadena en busca de la cadena con la dirección más alta para compactarla hacia la memoria alta, lo que resultó en un rendimiento, que podría introducir pausas de minutos en la ejecución de programas intensivos en cadenas. Un recolector de basura de reemplazo para Applesoft BASIC publicado en Call-APPLE (enero de 1981, páginas 40–45, Randy Wigginton ) identificó un grupo de cadenas en cada pasada del montón, lo que redujo drásticamente el tiempo de recolección. BASIC.System, lanzado con ProDOS en 1983, proporcionó un recolector de basura en ventanas para BASIC que redujo la mayoría de las recolecciones a una fracción de segundo. O ( norte 2 ) {\ Displaystyle O (n ^ {2})}

Objective-C [ editar ]

Mientras que 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. [17] Sin embargo, con la liberación 2012 de OS X 10.8 , recolección de basura desfasada y en favor de LLVM 's contador de referencia automático (ARC) que se introdujo con OS X 10.7 . [18] Además, desde mayo de 2015 Apple incluso prohíbe el uso de la recolección de basura para las nuevas aplicaciones de OS X en la App Store . [19] [20] ParaiOS , la recolección de basura nunca se ha introducido debido a problemas en la capacidad de respuesta y el rendimiento de la aplicación; [6] [21] en cambio, iOS usa ARC. [22] [23]

Entornos limitados [ editar ]

La recolección de basura rara vez se usa en sistemas integrados 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. [24] Microsoft .NET Micro Framework , .NET nanoFramework y Java Platform, Micro Edition son plataformas de software integradas que, al igual que sus primos más grandes, incluyen la recolección de basura.

Java [ editar ]

Los recolectores de basura disponibles en los JDK de Java incluyen:

  • G1
  • Paralelo
  • Recopilador de barrido de marcas concurrentes (CMS)
  • De serie
  • C4 (Colector de compactación continuamente concurrente) [25]
  • Shenandoah
  • ZGC

Uso en tiempo de compilación [ editar ]

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 en función de las invariantes conocidas durante la compilación.

Esta forma de recolección de basura se ha estudiado en el lenguaje de programación Mercurio , [26] y se vio un mayor uso con la introducción de LLVM 's contador de referencia automática (ARC) en el ecosistema de Apple (iOS y OS X) en 2011. [22] [23] [19]

Sistemas en tiempo real [ editar ]

Se han desarrollado recolectores de basura incrementales, concurrentes y en tiempo real, como el algoritmo de Baker o el algoritmo de Lieberman . [27] [28] [29]

En el algoritmo de Baker, la asignación se realiza en cualquier mitad de una única región de memoria. Cuando se llena a la mitad, se realiza una recolección de basura que mueve los objetos activos a la otra mitad y los objetos restantes se desasignan implícitamente. El programa en ejecución (el 'mutador') tiene que verificar que cualquier objeto al que hace referencia esté en la mitad correcta y, si no, moverlo, mientras una tarea en segundo plano encuentra todos los objetos. [30]

Los esquemas generacionales de recolección de basura 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), que se mantienen separadas según la edad del objeto. Se crean nuevos objetos en la generación "joven" que se recopila regularmente, y cuando una generación está completa, los objetos a los que todavía se hace referencia de regiones más antiguas se copian en la siguiente generación más antigua. Ocasionalmente se realiza un escaneo completo.

Algunas arquitecturas informáticas de lenguaje 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 el rastreo . [ cita requerida ] Estos recolectores de basura en tiempo real cumplen con las estrictas restricciones de tiempo real cuando se utilizan con un sistema operativo en tiempo real. [31]

Ver también [ editar ]

  • Destructor (programación de computadoras)
  • Eliminación de código muerto
  • Puntero inteligente
  • Compresión de memoria virtual

Referencias [ editar ]

  1. ^ Harold Abelson y Gerald Jay Sussman y Julie Sussman (2016). Estructura e interpretación de programas informáticos (PDF) (2ª ed.). Cambridge, MA: MIT Press. Aquí: p.734-736
  2. ^ McCarthy, John (1960). "Funciones recursivas de expresiones simbólicas y su computación por máquina, Parte I" . Comunicaciones de la ACM . 3 (4): 184-195. doi : 10.1145 / 367177.367199 . S2CID 1489409 . Consultado el 29 de mayo de 2009 . 
  3. ^ "Descripción general - Lenguaje de programación D" . dlang.org . Marte digital . Consultado el 29 de julio de 2014 .
  4. Zorn, Benjamin (22 de enero de 1993). "El costo medido de la recolección de basura conservadora". Práctica y experiencia en software . Departamento de Ciencias de la Computación, Universidad de Colorado Boulder . 23 (7): 733–756. CiteSeerX 10.1.1.14.1816 . doi : 10.1002 / spe.4380230704 . S2CID 16182444 .  
  5. ^ Matthew Hertz; Emery D. Berger (2005). "Cuantificación del rendimiento de la recolección de basura frente a la gestión de memoria explícita" (PDF) . Actas de la 20ª Conferencia Anual ACM SIGPLAN sobre Programación, Sistemas, Lenguajes y Aplicaciones Orientadas a Objetos - OOPSLA '05 . pag. 313. doi : 10.1145 / 1094811.1094836 . ISBN  1595930310. S2CID  6570650 . Consultado el 15 de marzo de 2015 .
  6. ^ a b "Kickoff de herramientas para desarrolladores - sesión 300" (PDF) . WWDC 2011 . Apple Inc. 2011-06-24 . Consultado el 27 de marzo de 2015 .
  7. ^ Recuento de recolección de basura de referencia
  8. ^ "Recuentos de referencia" . Ampliación e incorporación del intérprete de Python . 2008-02-21 . Consultado el 22 de mayo de 2014 .
  9. ^ Mike Ash. "Viernes Q&A 2013-09-27: ARM64 y usted" . mikeash.com . Consultado el 27 de abril de 2014 .
  10. ^ "Hamster Emporium: [objc explicar]: no puntero isa" . Sealiesoftware.com. 2013-09-24 . Consultado el 27 de abril de 2014 .
  11. ^ RAII, objetos dinámicos y fábricas en C ++, Roland Pibinger, 3 de mayo de 2005
  12. ↑ a b Yossi Levanoni, Erez Petrank (2001). "Un recolector de basura de conteo de referencias sobre la marcha para Java" . Actas de la 16ª Conferencia ACM SIGPLAN sobre programación, sistemas, lenguajes y aplicaciones orientadas a objetos . OOPSLA 2001. págs. 367–380. doi : 10.1145 / 504282.504309 .
  13. ↑ a b Yossi Levanoni, Erez Petrank (2006). "Un recolector de basura de conteo de referencias sobre la marcha para Java" . ACM Trans. Programa. Lang. Syst . 28 : 31–69. CiteSeerX 10.1.1.15.9106 . doi : 10.1145 / 1111596.1111597 . S2CID 14777709 .  
  14. ^ Salagnac, G; et al. (24 de mayo de 2005). "Análisis de escape rápido para la gestión de memoria basada en regiones" . Notas electrónicas en informática teórica . 131 : 99-110. doi : 10.1016 / j.entcs.2005.01.026 .
  15. Chisnall, David (12 de enero de 2011). Lenguajes de programación influyentes, Parte 4: Lisp .
  16. ^ "PHP: consideraciones de rendimiento" . php.net . Consultado el 14 de enero de 2015 .
  17. ^ Descripción general de Objective-C 2.0
  18. ^ Mac OS X 10.7 Lion: la revisión de Ars Technica John Siracusa (20 de julio de 2011)
  19. ^ a b Apple dice que los fabricantes de aplicaciones de Mac deben realizar la transición a la administración de memoria ARC antes de mayo por AppleInsider (20 de febrero de 2015)
  20. Cichon, Waldemar (21 de febrero de 2015). "App Store: Programa entrante de Apple con recolección de basura" . Heise.de . Consultado el 30 de marzo de 2015 .
  21. Silva, Precious (18 de noviembre de 2014). "iOS 8 vs Android 5.0 Lollipop: Apple mata a Google con la eficiencia de la memoria" . Tiempos de negocios internacionales . Consultado el 7 de abril de 2015 .
  22. ↑ a b Rob Napier, Mugunth Kumar (20 de noviembre de 2012). Programación iOS 6 superando los límites . John Wiley e hijos . ISBN 9781118449974. Consultado el 30 de marzo de 2015 .
  23. ↑ a b Cruz, José RC (22 de mayo de 2012). "Recuento automático de referencias en iOS" . Dr. Dobbs . Consultado el 30 de marzo de 2015 .
  24. ^ 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 integrados - SCOPES '05 . págs. 20-26. doi : 10.1145 / 1140389.1140392 . ISBN 1595932070. S2CID  8635481 .
  25. ^ Tene, Gil; Iyengar, Balaji; Wolf, Michael (2011). "C4: el colector de compactación continuamente concurrente" (PDF) . ISMM '11: Actas del simposio internacional sobre gestión de la memoria . doi : 10.1145 / 1993478 . ISBN  9781450302630.
  26. ^ Mazur, Nancy (mayo de 2004). Recolección de basura en tiempo de compilación para el lenguaje declarativo Mercury (PDF) (Tesis). Katholieke Universiteit Leuven .
  27. ^ Huelsbergen, Lorenz; Winterbottom, Phil (1998). "Recolección de basura de marca y barrido muy concurrente sin sincronización de grano fino" (PDF) . Actas del Primer Simposio Internacional sobre Gestión de la Memoria - ISMM '98 . págs. 166-175. doi : 10.1145 / 286860.286878 . ISBN  1581131143. S2CID  14399427 .
  28. ^ "Preguntas frecuentes de GC" .
  29. ^ Lieberman, Henry; Hewitt, Carl (1983). "Un recolector de basura en tiempo real basado en la vida útil de los objetos" . Comunicaciones de la ACM . 26 (6): 419–429. doi : 10.1145 / 358141.358147 . hdl : 1721,1 / 6335 . S2CID 14161480 . 
  30. ^ Baker, Henry G. (1978). "Procesamiento de listas en tiempo real en un ordenador serie". Comunicaciones de la ACM . 21 (4): 280-294. doi : 10.1145 / 359460.359470 . hdl : 1721,1 / 41976 . S2CID 17661259 . ver también descripción
  31. ^ McCloskey, tocino, Cheng, Grove. "Staccato: un recolector de basura compactador en tiempo real paralelo y concurrente para multiprocesadores" . 2008.

Lectura adicional [ editar ]

  • Jones, Richard; Hosking, Antonio; Moss, J. Eliot B. (16 de agosto de 2011). El manual de recolección de basura: el arte de la administración automática de memoria . Serie de estructuras de datos y algoritmos aplicados de CRC. Chapman y Pasillo / 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 independiente de la máquina eficiente para la recolección de basura en varias estructuras de lista" (PDF) . Comunicaciones de la ACM . 10 (8): 501–506. doi : 10.1145 / 363534.363554 . S2CID  5684388 .
  • Wilson, Paul R. (1992). "Técnicas de recolección de basura monoprocesador". Actas del Taller Internacional sobre Gestión de la Memoria (IWMM 92) . Apuntes de conferencias en Ciencias de la Computación. Springer-Verlag . 637 : 1–42. CiteSeerX  10.1.1.47.2438 . doi : 10.1007 / bfb0017182 . ISBN 3-540-55940-X.
  • Wilson, Paul R .; Johnstone, Mark S .; Neely, Michael; Boles, David (1995). "Asignación dinámica de almacenamiento: una encuesta y revisión crítica". Actas del Taller Internacional sobre Gestión de la Memoria (IWMM 95) . Lecture Notes in Computer Science (1 ed.). 986 : 1–116. CiteSeerX  10.1.1.47.275 . doi : 10.1007 / 3-540-60368-9_19 . ISBN 978-3-540-60368-9.

Enlaces externos [ editar ]

  • La referencia de gestión de la memoria
  • Los conceptos básicos de la recolección de basura
  • Ajuste de la recolección de basura de la máquina virtual Java SE 6 HotSpot ™
  • TinyGC: una implementación independiente de la API de BoehmGC
  • Implementación conservadora de recolección de basura para lenguaje C
  • MeixnerGC: un recolector de basura incremental de marcado y barrido para C ++ usando punteros inteligentes