En Java, le garbage collector supprime automatiquement les objets inutilisés pour libérer la mémoire. Les développeurs n’ont pas besoin de marquer les objets à supprimer, ce qui est sujet aux erreurs et vulnérable à la fuite de mémoire. Il est donc raisonnable que Java n’ait pas de destructeurs disponibles.
Si les objets contiennent des sockets ouverts, des fichiers ouverts ou des connexions à la base de données, le garbage collector n’est pas en mesure de récupérer ces ressources. Nous pouvons libérer les ressources dans la méthode close et utiliser la syntaxe try-finally pour appeler la méthode par la suite avant Java 7, comme les classes d’E / S FileInputStream et FileOutputStream. À partir de Java 7, nous pouvons implémenter l’interface AutoCloseable et utiliser l’instruction try-with-resources pour écrire du code plus court et plus propre. Mais il est possible que les utilisateurs de l’API oublient d’appeler la méthode close, de sorte que la méthode finalize et la classe Cleaner apparaissent pour servir de filet de sécurité. Mais attention, ils ne sont pas équivalents au destructeur.
Il n’est pas assuré que la méthode finalize et la classe Cleaner fonctionneront rapidement. Ils n’ont même aucune chance de s’exécuter avant la sortie de la JVM. Bien que nous puissions appeler le système.runFinalization pour suggérer que la JVM exécute les méthodes finalize de tous les objets en attente de finalisation, c’est toujours non déterministe. De plus, la méthode de finalisation peut entraîner des problèmes de performances, des blocages, etc. Nous pouvons trouver plus d’informations en consultant l’un de nos articles: Un Guide de la méthode finalize en Java. À partir de Java 9, la classe Cleaner est ajoutée pour remplacer la méthode finalize en raison des inconvénients qu’elle présente. En conséquence, nous avons un meilleur contrôle sur le fil qui effectue les actions de nettoyage. Mais la spécification java souligne le comportement des nettoyeurs pendant le système.exit est spécifique à l’implémentation et Java ne fournit aucune garantie si les actions de nettoyage seront invoquées ou non.