Java e i memory leak

15 ottobre 2007

Java possiede ottime caratteristiche per la creazione di applicazioni professionali. In particolare è possibile, usando l’ambiente J2EE, creare applicazioni scalabili e affidabili in contesti multiutente. Purtroppo, però, ci sono casi in cui le applicazioni possono contenere del codice che causa un progressivo deterioramento del sistema, fino a un blocco dell’applicazione, se questa è stand-alone, o dell’application server/servlet container che la contiene, se è un’applicazione Web.

L’articolo mostra quando si può verificare questo comportamento, illustrando, con esempi concreti, come anche Java possa avere problemi di gestione della memoria.

Garbage collector: come funziona

Uno dei vantaggi del linguaggio Java è quello di non dover provvedere alla deallocazione degli oggetti creati in quanto ad occuparsene è un componente chiamato “garbage collector“, che entra in azione in particolari circostanze. Il compito di questo componente è quello di eliminare oggetti non più in uso e, in questo modo, rendere di nuovo disponibile la memoria occupata da tali oggetti.

Purtroppo ci sono delle circostanze in cui il garbage collector fallisce nel suo compito; tali fallimenti non sono dati da una sua errata implementazione, ma da un uso improprio degli oggetti costruiti dall’applicazione. È bene considerare attentamente queste situazioni sia per evitarle che per riuscire ad individuarle. In questi casi si parla di “memory leak” (termine che si potrebbe tradurre con “falla nella memoria”, anche se è comune usare il termine inglese).

Quando un oggetto è in uso

La prima cosa da comprendere è capire quando un oggetto è considerato “in uso” e, come tale, non può essere deallocato dal garbage collector. Un oggetto viene creato in presenza della parola chiave “new”; si può memorizzare tale oggetto assegnandolo ad una variabile:

Listato 1. Creazione di un nuovo oggetto e assegnazione ad una variabile

public unaClasse{
  public String unMetodo(){
    //[…]
    rif = new Date();
  }
}

Il garbage collector lo considera “in uso” fin quando il life time (o visibilità) della variabile (che ne contiene il riferimento) è valido. Pertanto, nel caso della seguente classe:

Listato 2. Life time della variabile che coincide con quello della classe

public unaClasse{
  Date rif;
  public String unMetodo(){
    rif = new Date();
  }
}

Se vuoi aggiornamenti su Java e i memory leak inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Java e i memory leak

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy