C Garbage Collector

Da Andreabont's Wiki.

Utilizzando l'apposita libreria garbage collector è possibile utilizzare in C un garbage collector conservativo. La stessa libreria può essere usata per cercare dei memory leak a run-time. Questo GC è di tipo conservativo ed implementa un algoritmo mark-sweep.

Chiamate alternative alla libreria standard

Queste chiamate sono l'equivalente delle chiamate per la gestione della memoria presenti nella libreria standard, con la differenza con la memoria viene gestita in collaborazione con il garbarge collector.

Malloc

Alloca e tiene sotto osservazione un vettore di dimensione specificata, nel nostro esempio 10 interi.

int *ptr = GC_MALLOC(10 * sizeof(int));

Realloc

Modifica la dimensione della memoria precedentemente allocata. Nel nostro esempio aumento la dimensione a 20 interi.

int *ptr = GC_REALLOC(ptr, 20 * sizeof(int));

Deallocare

Se si vuole forzare la deallocazione della memoria, senza attendere l'intervento del garbage collector, è possibile usare la chiamata:

GC_FREE(ptr);

Esempio

#include "gc.h"
#include <assert.h>
#include <stdio.h>

int main()
{
  int i;

  GC_INIT();	/* Optional on Linux/X86; see below.  */
  for (i = 0; i < 10000000; ++i)
   {
     int **p = (int **) GC_MALLOC(sizeof(int *));
     int *q = (int *) GC_MALLOC_ATOMIC(sizeof(int));
     assert(*p == 0);
     *p = (int *) GC_REALLOC(q, 2 * sizeof(int));
     if (i % 100000 == 0)
       printf("Heap size = %d\n", GC_get_heap_size());
   }
  return 0;
}

Compilare

Se necessario indicare il path dove trovare gli include necessari e la libreria condivisa.

gcc file.c -lgc [-I/path_install/include/gc] [-L/path_install/lib64]

Se si vuole far usare il garbage collector a del codice non pensato per usarlo, è possibile "reindirizzare" le malloc e le free a compile-time:

gcc file.c -DREDIRECT_MALLOC=GC_malloc -DIGNORE_FREE -lgc [-I/path_install/include/gc] [-L/path_install/lib64]

Variabili d'ambiente

E' possibile ottenere modificare l'esecuzione impostando le seguenti variabili d'ambiente:

Statistiche

GC_PRINT_STATS=1 ./eseguibile         # Informazioni base
GC_PRINT_VERBOSE_STATS=1 ./eseguibile # Informazioni estese
GC_DUMP_REGULARLY=1 ./eseguibile      # Esegui dump durante l'esecuzione

Configurazione memoria

GC_INITIAL_HEAP_SIZE=10M ./eseguibile # Dimensione iniziale dell'heap
GC_MAXIMUM_HEAP_SIZE=10M ./eseguibile # Dimensione massima dell'heap