La méthode finalize() définie dans la classe Java.lang.Object, permet d'effectuer des opérations de finalisation en général une opération de nettoyage d'un objet avant que le système de Garbage Collector ne s'en charge ou que ce dernier ne peut accomplir, comme dans le cas d'un objet de système de fichier, ou encore de connexion réseau.
protected void finalize() throws Throwable
La méthode finalize() est automatiquement appelée par un thread spécialisé (Finalizer), si elle existe dans la classe de l'objet, avant que le collecteur de déchets n'entreprenne le recyclage de ce dernier.
Un objet déréférencé peut par l'intermédiaire de la méthode de finalisation redevenir atteignable, c'est-à-dire retrouver une référence dans le programme.
Subséquemment, le GC vérifie à nouveau l'accessibilité de l'objet par le programme et si celui-ci possède effectivement, une nouvelle référence, alors il abandonne le processus de récupération des ressources pour l'objet en cours.
La méthode finalize() n'est jamais appelée plus d'une fois pour un objet donné.
La méthode System.runFinalization() lance la méthode finalize() de n'importe quel objet inatteignable avant que le processus de Garbage Collector ne commence.
public static void runFinalization() System.runFinalization(); Runtime.getRuntime().runFinalization(); //Equivalent à System.runFinalization();
L'appel de cette méthode incite la Machine Virtuelle Java (JVM) à effectuer des tentatives d'exécution des méthodes finalize() des objets qui ont été trouvés pour leur inaccessibilité, mais dont les méthodes de finalisation n'ont pas encore été lancées.
public class CollecteurDechets extends Thread { public CollecteurDechets() { super(); } public void run() { long i = 0; while (true) { if (verifierPremier(i)) { NombrePremier objet = new NombrePremier( String.valueOf(i)); if(i > Short.MAX_VALUE) break; } i++; } } public boolean verifierPremier(long nombre) { if (nombre < 0) { return false; } else if (nombre < 4) { return true; } else { for (int i = 4; i <= nombre / 2; i++) { if (nombre != i && nombre % i == 0) { return false; } } } return true; } public static void main(String[] args) { CollecteurDechets thread = new CollecteurDechets(); thread.start(); while (thread.isAlive()) { try { Thread.sleep(500); } catch (InterruptedException e) { } } } } public class NombrePremier { private String valeur; public NombrePremier(String valeur) { this.valeur = valeur; } public String getValeur() { return this.valeur; } public void setValeur(String valeur) { this.valeur = valeur; } protected void finalize() throws Throwable { System.out.println("Invocation de la méthode finalize()"); System.out.println("Contenu de l'objet : " + valeur); System.out.println("Nom du thread courant : " + Thread.currentThread().getName()); this.valeur = null; } } /* Affiche ... Invocation de la méthode finalize() Contenu de l'objet : 34807 Finalizer Invocation de la méthode finalize() Contenu de l'objet : 34781 Finalizer Invocation de la méthode finalize() Contenu de l'objet : 34763 Finalizer ... */