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.
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).
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();
}
}
|
Struts vs JSF, le principali differenze tra i due framework per il Web |
Guida Apache StrutsIl primo e più utilizzato tra i framework MVC del mondo Java,... |
Guida Java SpringScoprire il lightweight container più famoso del mondo Java.... |
Guida Java 6Prendendo le mosse dalla guida Java, già presente su HTML.it,... |
Ogni mese, direttamente nella tua e-mail: articoli, script e guide su Java, Visual Basic, VB.Net ed i più diffusi linguaggi di programmazione.
Iscriviti alla newsletter