Un objet ou un tableau alloué dans un programme Java et qui se trouve ne plus être référencé (c'est-à-dire tel qu'aucune variable du programme ne contient l'adresse de cet objet ou tableau) ne peut plus servir dans le programme en cours d'exécution.
Le langage Java utilise un ramasse-miettes (garbage collector en anglais, quelquefois abrégé en gc), processus de basse priorité qui de temps à autre recherche quels sont les objets ou tableaux qui ne sont plus référencés, et libère alors l'espace en mémoire alloué à ceux-ci.
Un objet peut bloquer d'autres types de ressources que de
l'espace
en mémoire, comme un descripteur de fichier ou une socket.
On
peut utiliser un finaliseur pour libérer ce type de
ressource.
Le finaliseur est une méthode qui redéfinit la
méthode :
protected
void finalize() {}
de la classe Object.
Lorsque le ramasse-miettes découvre qu'un objet n'est plus
référencé, il lui applique la
méthode finalize()
de cet objet avant de libérer l'espace en mémoire
alloué à à cet objet . Il est possible
que dans le
corps de la méthode finalize(), il y
ait une instruction telle que :
unObjet = this;
qui ressuscite en quelque sorte l'objet qui n'était plus
référencé, c'est pourquoi l'espace en
mémoire alloué à l'objet ne sera en
fait
libéré qu'après une nouvelle
vérification
du fait qu'il n'est pas référencé.
L'exemple ci-dessous utilise un fichier, thème qui sera abordé ultérieurement ; vous pouvez vous contenter d'obsever la façon de définir un finaliseur. Ne vous inquiétez pas de ce que, ici, le finaliseur n'aura pas l'occasion d'être exécuté.
L'objectif principal du programme est d'écrire le
mot
"bonjour" dans un fichier dont le nom est indiqué sur la
ligne
de commande. Il est toujours important de fermer un fichier qui a
été ouvert en utilisant la méthode close,
ce qui est fait dans le programme ci-dessous.
Le mot protected correspond
à un niveau de visibilité qui sera
étudié plus tard.
Pour l'objectif de cette page, il y a juste à observer
l'existence de la méthode finalize et
à savoir que si, dans un programme plus
élaboré, l'objet ouvrage du
main
se trouvait ne plus être
référencé, et donc
ne pourrait plus être utilisé par le programme en
cours
d'exécution, le ramasse-miettes, à son passage,
invoquerait la méthode finalize avant
de libérer l'espace-mémoire occupé par
ouvrage.
import java.io.PrintWriter;
Pour accéder à EssaiFinaliseur.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
class BienFerme {
PrintWriter livre;
BienFerme(String nom) throws FileNotFoundException {
livre = new PrintWriter(new FileOutputStream(nom));
}
protected void finalize() {
if (livre != null) livre.close();
}
}
class EssaiFinaliseur {
public static void main(String arg[]) throws FileNotFoundException {
BienFerme ouvrage = new BienFerme(arg[0]);
ouvrage.livre.println("bonjour");
ouvrage.livre.close();
}
© Charon Irène Télécom ParisTech 2011