Java Language Finalisation


Exemple

Un objet Java peut déclarer une méthode de finalize . Cette méthode est appelée juste avant que Java ne libère la mémoire pour l'objet. Il ressemblera généralement à ceci:

public class MyClass {
  
    //Methods for the class

    @Override
    protected void finalize() throws Throwable {
        // Cleanup code
    }
}

Cependant, il existe des mises en garde importantes sur le comportement de la finalisation Java.

  • Java ne garantit pas qu'une méthode finalize() sera appelée.
  • Java ne garantit même pas qu'une méthode finalize() sera appelée quelque temps pendant la durée de vie de l'application en cours d'exécution.
  • La seule chose garantie est que la méthode sera appelée avant que l'objet soit supprimé ... si l'objet est supprimé.

Les mises en garde ci-dessus signifient que c'est une mauvaise idée de compter sur la méthode finalize pour effectuer des actions de nettoyage (ou autres) qui doivent être effectuées en temps opportun. Dépendre de la finalisation peut entraîner des fuites de stockage, des fuites de mémoire et d’autres problèmes.

En bref, il existe très peu de situations où la finalisation est en fait une bonne solution.

Les finaliseurs ne s'exécutent qu'une seule fois

Normalement, un objet est supprimé après sa finalisation. Cependant, cela n'arrive pas tout le temps. Prenons l'exemple suivant 1 :

public class CaptainJack {
    public static CaptainJack notDeadYet = null;

    protected void finalize() {
        // Resurrection!
        notDeadYet = this;
    }
}

Lorsqu'une instance de CaptainJack devient inaccessible et que le ramasse-miette tente de le récupérer, la méthode notDeadYet finalize() attribue une référence à l'instance à la variable notDeadYet . Cela rendra l'instance accessible une fois de plus, et le ramasse-miettes ne le supprimera pas.

Question: Le capitaine Jack est-il immortel?

Réponse: non

Le catch est que la JVM exécutera uniquement un finaliseur sur un objet une fois dans sa vie. Si vous attribuez la valeur null à notDeadYet provoquant une inaccessibilité de l'instance notDeadYet , le ramasse-miettes n'appelle pas finalize() sur l'objet.

1 - Voir https://en.wikipedia.org/wiki/Jack_Harkness .