Cuando utiliza un lenguaje con recolección de basura no obtendrá acceso a la memoria directamente. Más bien, se te da acceso a cierta abstracción sobre esos datos. Una de las cosas que se abstrae correctamente es la ubicación real en la memoria del bloque de datos, así como punteros a otros bloques de datos. Cuando se ejecuta el recolector de elementos no utilizados (esto ocurre de vez en cuando), comprobará si aún tiene una referencia a cada uno de los bloques de memoria que le ha asignado. Si no lo hace, liberará esa memoria.
La principal diferencia entre los diferentes tipos de recolectores de basura es su eficiencia, así como cualquier limitación sobre qué tipo de esquemas de asignación pueden manejar.
El más simple es el recuento de referencias adecuado. Cada vez que crea una referencia a un objeto, se incrementa un contador interno en ese objeto, cuando hace la referencia o deja de estar en el alcance, el contador en el (anterior) objeto objetivo se reduce. Cuando este contador llega a cero, el objeto ya no se remite y puede liberarse.
El problema con el recuento de basureros de recuento de referencias es que no pueden tratar con datos circulares. Si el objeto A tiene una referencia al objeto B y que a su vez tiene alguna referencia (directa o indirecta) al objeto A, nunca podrán liberarse, incluso si ninguno de los objetos de la cadena está arbitrado fuera de la cadena (y por lo tanto no lo son). t accesible para el programa en absoluto).
El algoritmo de marca y barrido, por otro lado puede manejar esto. El algoritmo de marca y barrido funciona al detener periódicamente la ejecución del programa, marcar cada elemento que el programa ha asignado como inalcanzable. El programa luego ejecuta todas las variables que tiene el programa y marca lo que señalan como alcanzable. Si cualquiera de estas asignaciones contiene referencias a otros datos en el programa, esos datos también se marcan como alcanzables, etc.
Esta es la parte de marca del algoritmo. En este punto , todo el programa al que se puede acceder, sin importar cuán indirectamente, se marque como accesible y todo lo que el programa no puede alcanzar se marca como inalcanzable. El recolector de basura ahora puede reclamar de forma segura la memoria asociada con los objetos marcados como inalcanzables.
El problema con el algoritmo de marcaje y barrido es que no es tan eficiente: todo el programa tiene que detenerse para ejecutarlo, y muchas de las referencias de objeto no van a cambiar.
Para mejorar esto, el algoritmo de marca y barrido se puede ampliar con la llamada "recolección de basura generacional". En este modo, los objetos que han estado en el sistema para cierto número de colecciones de basura se promueven a la generación anterior, que no se comprueba con tanta frecuencia.
Esto mejora la eficiencia porque los objetos tienden a morir jóvenes (piense en una cuerda cambiada dentro de un bucle, dando como resultado quizás una vida de unos cientos de ciclos) o viva mucho tiempo (los objetos utilizados para representar la ventana principal de un aplicación, o la conexión de base de datos de un servlet).
Se puede encontrar mucha más información detallada en wikipedia.
añadido basado en los comentarios:
Con la marca y barrer algoritmo (así como cualquier otro algoritmo de recolección de basura, excepto el recuento de referencias) la recolección de basura hacer no ejecutan en el contexto de su programa, ya tiene que poder acceder a cosas a las que su programa no puede acceder directamente. Por lo tanto, no es correcto decir que el recolector de basura se ejecuta en la pila.
Nopes ... no lo es. Probablemente parece solo porque lo puse de esa manera. De cualquier manera –
Yo recomendaría leer el bastante bueno, documento ilustrado de 34 páginas, [* Uniprocessor Garbage Collection Techniques *, por Paul R. Wilson (1992)] (http://www.cse.nd.edu/~dthain /courses/cse40243/spring2006/gc-survey.pdf), que explica los conceptos detrás de las técnicas básicas de recolección de basura (recuento de referencias, marcado y barrido, marca compacta, incremental, generacional). – stakx