# Recollida de memòria brossa

En informàtica, la recollida de memòria brossa o recollida d'escombraries (de l'anglès, garbage collection) és un mecanisme implícit de gestió de memòria implementat en alguns compiladors i intèrprets de llenguatges de programació. Aquest concepte fou desenvolupat per John McCarthy a 1959 per evitar la gestió manual de memòria en el llenguatge Lisp.

## Context

Qualsevol programa informàtic fa ús d'una certa quantitat de memòria de treball posada a la seva disposició pel sistema operatiu. Aquesta memòria ha de ser gestionada pel mateix programa per:
* Reservar espais de memòria per al seu ús.
* Alliberar espais de memòria prèviament reservats.
* Compactar espais de memòria lliures i consecutius entre si.
* Portar compte de quins espais estan lliures i quines no.
Generalment, el programador disposa d'una biblioteca de codi que s'encarrega d'aquestes tasques. No obstant això, el mateix programador és responsable d'utilitzar adequadament aquesta biblioteca.
Això té l'avantatge que es fa un ús eficient de la memòria, és a dir, els espais de memòria queden lliures quan ja no són necessaris. Tanmateix, aquest mecanisme explícit de gestió de memòria és propens a errors. Per exemple, un programador pot oblidar alliberar la memòria de manera que, tard o d'hora, no quedi memòria disponible, avortant l'execució del programa.
Com a alternativa, és necessària una gestió implícita de memòria, on el programador no és conscient de la reserva i alliberament de memòria. Això és obligat en alguns llenguatges de programació on no es maneja el concepte de memòria. Per exemple en llenguatges declaratius com Lisp o Prolog.

## Funcionament

Quan un llenguatge disposa de recollida d'escombraries, el programador no ha d'invocar una subrutina per alliberar memòria. La reserva de memòria també és més o menys automàtica sense la intervenció del programador. Per exemple:
* En els llenguatges orientats a objectes: es reserva memòria cada vegada que el programador crea un objecte, però aquest no ha de saber quanta memòria es reserva ni com es fa això.
* En els llenguatges declaratius: cada vegada que es construeix una expressió es reserva memòria (d'una manera intel·ligent), però el programador no és conscient d'això.
Quan es compila el programa, automàticament s'inclou en aquest una subrutina corresponent al 'recol·lector d'escombraries. Aquesta subrutina també és invocada periòdicament sense la intervenció del programador.
El recol·lector d'escombraries és informat de totes les reserves de memòria que es produeixen en el programa. A més, el compilador col·labora perquè sigui possible dur un compte de totes les referències que hi ha a un determinat espai de memòria reservat.
Quan s'invoca el recol·lector d'escombraries, recorre la llista d'espais reservats observant el comptador de referències de cada espai. Si un comptador ha arribat a zero significa que aquest espai de memòria ja no s'usa i, per tant, pot ser alliberat.
Naturalment, aquest procés consumeix un cert temps en què no es fa res veritablement útil per al propòsit del programa. Per tant, no pot ser invocat amb massa freqüència.
En conseqüència, l'únic inconvenient a aquest mecanisme és determinar quan s'ha d'executar el recol·lector d'escombraries. Hi ha diversos algorismes per fer-ho, però el més eficient és el primer d'ells:
* Esperar que no quedi memòria lliure, i llavors, executar el recol·lector d'escombraries.
* Fixar un llindar d'ocupació de la memòria lliure i executar el recol·lector d'escombraries quan se superi aquest llindar.
* Executar el recol·lector d'escombraries a intervals regulars (no sempre és possible).
* Executar el recol·lector d'escombraries just abans de cada reserva de memòria.
* Permetre al programador que invoqui explícitament al recol·lector d'escombraries quan vulgui.

## Avantatges i desavantatges

Els avantatges i desavantatges d'aquest mecanisme de gestió de memòria són les oposades al mecanisme explícit:
* El programador no pot cometre errors i queda alliberat de la tediosa tasca de gestionar la memòria.
* La memòria roman retinguda durant més temps de l'estrictament necessari.
* El recol·lector d'escombraries triga cert temps a fer la seva tasca i produeix pauses que poden fer la tècnica incompatible amb sistemes de temps real.

## Implementació

Hi ha la possibilitat d'implementar la recollida d'escombraries com una biblioteca de codi més, però per norma general no és així. El mateix disseny de certs llenguatges de programació fa necessària l'existència del recol·lector d'escombraries. Per poder implementar aquests llenguatges calen dues actuacions:
* Que el compilador proporcioni la informació necessària per al recol·lector d'escombraries (el comptador de referències).
* Que l'entorn d'execució o màquina virtual implementi la subrutina del recol·lector d'escombraries.

## Exemples de llenguatges amb Acces d'escombraries

* Algol 68
* BASIC
* C#
* Caml
* Clean
* D
* Eiffel
* Haskell
* Java
* JavaScript
* Lisp
* Lua
* Mercury
* ML
* Modula-3
* Oberon
* ocaml
* Oz
* Objective C 2.0
* Perl
* PHP
* Prolog
* Python
* Ruby
* Smalltalk
* SNOBOL
* SuperCollider

## Nota

* ↑ Dennis Chester Smolarski. The essentials of data structures. Research & Education Assoc., març 1990, p. 161–. ISBN 9780878918379 [Consulta: 1r juliol 2011].

## Enllaços externs

* Memory Management Reference (anglès)
* Citations from CiteSeer (anglès)