sábado, diciembre 06, 2008

Autozone: Gestión de memoria autonámica en MacOS X

Una de las novedades de Objective-C 2.0 es la posibilidad de gestionar la memoria través de un recoletor de basura (garbage collector) que se encarga de analizar la memoria buscando objetos que ya no están referenciados para liberar la memoria que están usando. Se llama Autozone y el código fuente está disponible con una licencia de tipo Apache.

En Objective C se (autorelease pools aparte) crean objetos de esta manera:

MyClass *c = [[Myclass alloc] init];
MyClass *ref;
...
ref=[OtroObjecto myclass];
[ref retain];
...
[c release];
[ref release];

El mecanismo de gestión de memoria en las anteriores versiones de Objetive C estaba basado en una cuenta del número de referencias que tiene hacia el objeto. Cuando se crea el objeto tiene una sola referencia. Si se le manda el mensaje retain la cuenta de referencias aumenta en uno, mientras que si se le manda el mensaje release la cuenta de referencias disminuye en uno. Cuando ésta llega a cero el sistema libera la memoria asignada al objeto. Hasta ahora, toda esta gestión hay que realizarla manualmente teniendo cuidado para evitar que se pierda la cuenta, porque sino tendríamos una pérdida de memoria.

Para facilitar la labor a los programadores Apple ha decidido implementar un recoletor de basura que facilite el trabajo a los programadores y no tengan que llevar la cuenta de referencias de los distintos objetos que se van creando y los que nos devuelve el sistema. Esta librería está escrita en C++ y según la documentación está pensado para usarlo en un entorno de ejecución donde parte de la memoria puede estar manejada por mecanismos distintos de los que ofrece Autozone.

La implementación ejecuta un hilo que va analizando la memoria, viendo la cuenta de referencias que tienen los objetos y construyendo un grafo que representa las relaciones entre los objetos que el programa ha creado. Si hay objetos aislados, significa que no existen referencias a los mismos por parte de otros objetos, y por tanto puede liberarse la memoria que utilizan.

Hay un hilo que está continuamente analizando las regiones de memoria. De esta manera se evita bloquear la ejecución de otros hilos mientras se analiza la memoria buscando objetos que no estén referenciados por otros.

Lo malo, es que no hay documentación que explique porqué está implementado la gestión de memoria de esta manera.

Referencias

Technorati Tags: ,

No hay comentarios: